Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Najpopularniejsze newsy
Forum PHP.pl > Forum > PHP
deha21
Potrzebuję zrobić coś takiego jak "Najpopularniejsze newsy". Ma to polegać na tym, że będzie wyświetlać z bazy np. 3 newsy które mają najwięcej komentarzy. I to umiem zrobić. Problem tylko jest taki, że trzeba zrobić ograniczenie tygodnia czyli newsy które pojawiły się w ciągu ostatniego tygodnia i które mają najwięcej komentarzy. W bazie mam wpisaną datę w formacie 09.03.2010 i pewnie potrzebne jest tutaj porównanie daty newsa z aktualną datą - 7 dni. Ale jak to zrobić?
Pozdrawiam
blooregard
DATEDIFF
http://dev.mysql.com/doc/refman/5.0/en/dat...nction_datediff
deha21
O super! Czyli post właściwie powinien się znaleźć w sekcji MySQL winksmiley.jpg Ale mam pytanie, czy da się tam zmienić format daty? Bo jest 2010-03-09. Albo w PHP jest jakaś funkcja do zmiany?
blooregard
http://dev.mysql.com/doc/refman/5.0/en/dat...ion_date-format

W tym samym rozdziale.
Poza tym masz na dev.mysql.com spis treści oraz wyszukiwarkę.
deha21
Ok format daty rozwiązany.
Nie wiem czy dobrze zrozumiałem działanie datediff bo mi nie działa winksmiley.jpg Ale tak zacząłem się chyba zastanawiać, że to jednak nie o to mi chodziło. Z tego co wyczytałem to zwraca to liczbę dni między dwoma datami. Liczba dni chyba nie jest mi potrzebna bo np. 01.03.2010 i od tego odejmę liczbe dni 7 to wyjdą jakieś farfocle (bo wtedy przechodzi na poprzedni miesiąc).
Dzięki mktime obliczyłem datę która była 7 dni temu. Tylko jak teraz napisać zapytanie do MySQLa które wyświetli mi liste newsów z datą między aktualną i tą którą sobie wyliczyłem, biorąc pod uwagę to że date newsów trzymam w bazie w polu 'data'. Sam się zamotałem i nie wiem czy to dobrze rozumiem.
thek
Za dużo motasz smile.gif Najprościej by było, gdybyś sobie w PHP policzył datę, która była 7 dni temu (coś w stylu date( 'Y-m-d', strtodate('-7 days') ) ), a potem wrzucił ją do zapytania jako
WHERE data > '$wyliczona'
i na bank zadziała. Jeśli chcesz w jakichś innych przedziałach czasowych to jedynie te daty liczysz i wstawiasz jako
WHERE data BETWEEN '$start' AND '$koniec'
Żadna wielka filozofia z ty nie jest związana.
deha21
Kurcze! Ale łatwe biggrin.gif
Teraz potrzebuje wyciągnąć z tabeli 'komentarze' takie rekordy których w polu 'news' jest najczęściej powtarzana wartość... nie wiem jak to wytłumaczyć.
Po prostu chcę wyświetlić newsy które mają najwięcej komentarzy. Struktura bazy jest taka:
Kod
NEWS:
id | title | tresc

KOMENTARZE:
id | news | tresc


Do pola 'news' w tabeli 'komentarze' wpisuje się ID newsa którego dotyczy komentarz. Nie ma żadnych relacji między tabelami bo jeszcze nie umiem tego robić winksmiley.jpg A wydaje mi się, że gdyby były to byłoby łatwiej to zrobić. Chyba, że da się na szybko to jakoś zrobić bo nie mogę od nowa robić bazy, to co robię to jest mała modyfikacja.
Myślałem, że sobie poradzę ale to jednak przewyższa moje umiejętności.
thek
Cytat z Twojego własnego posta w tym temacie: "będzie wyświetlać z bazy np. 3 newsy które mają najwięcej komentarzy. I to umiem zrobić."
A nagle Twój ostatni post to: "potrzebuje wyciągnąć z tabeli 'komentarze' takie rekordy których w polu 'news' jest najczęściej powtarzana wartość... nie wiem jak to wytłumaczyć. Po prostu chcę wyświetlić newsy które mają najwięcej komentarzy.".
Albo ja jestem młotem, albo ktoś mnie w konia ładuje. To umiesz to w końcu zrobić czy nie? Ja się gubię winksmiley.jpg
Bo wybranie o jakim mówisz jest proste i opiera się na dobrze napisanym podzapytaniu gdzie w warunku określisz właściwe id newsa. Podpowiem, że max i count Ci się przydadzą.
deha21
No właśnie myslałem, że umiem i dlatego tak napisałem w pierwszym poście. Ale jak przyszło co do czego to siadłem i się gapiłem w monitor winksmiley.jpg A wydawało się takie proste.
Ok dzięki, pokombinuje z max i count.

Mam coś takiego:
  1. $date=date('d.m.Y');
  2. $unix=mktime(0, 0, 0, date("m"), date("d")-1, date("Y")); // testowo ustawiłem na -1 dzień
  3. $week=date('d.m.Y',$unix);
  4.  
  5.  
  6. $pop=mysql_query("SELECT id, COUNT(news) FROM commentsnews GROUP BY news ORDER BY COUNT(news) DESC");
  7. while($poprow=mysql_fetch_array($pop)) {
  8. $hot=mysql_query("SELECT id, title FROM news WHERE id='".$poprow['id']."'");
  9. $hotrow=mysql_fetch_array($hot);
  10. echo "<a href='#'>".$hotrow['title']."</a>
  11. <span>".$poprow['COUNT(news)']." komentarzy</span>";
  12. }

Wyświetla newsy które mają najwięcej komentarzy. Teraz trzeba dołożyć datę i nie wiem jak to zrobić. Poza tym nawet ja widzę, że zapytanie nie jest wydajne.
thek
Pomyśl więc o zasadzie, której powinieneś przestrzegać zawsze: "Już w pierwszym kroku ogranicz jak najbardziej liczbę wierszy na jakich operujesz". A czym w pierwszej kolejności to będzie? Ano wyrwaniem z bazy rekordów z określonego przedziału czasowego. To one najbardziej ograniczą liczbę wierszy, na których będziesz operował. A więc już na etapie tworzenia pakietu rekordów tabeli to zrób. Zamiast posyłać do grupowania całość tabeli newsów bądź komentarzy poślij tam jedynie te już okrojone według daty (zależnie czy chcesz newsy z danego okresu czy komentarze). Tak więc zapytanie tyczące newsów z okresu od daty $start do dziś oraz max komentarzy mające to będzie coś w stylu:
  1. SELECT n.*, count(k.id) AS ile FROM (SELECT * FROM newsy WHERE DATA > $start ) AS n LEFT JOIN komentarze AS k ON n.id = k.id_newsa GROUP BY n.id ORDER BY ile DESC
Oczywiście sobie dopasuj do potrzeb smile.gif
deha21
Ograniczyć to jak chciałem ale nie widziałem jak winksmiley.jpg Domyślalem się, że będą jakieś JOINy i inne takie, a z tym niestety nie jestem znajomy. Nie wszystko rozumiem w tym kodzie ale pozamieniłem, pododawałem i działa. Jestes wielki! biggrin.gif
thek
To wytłumaczę to łopatologicznie. Wybierz wszystkie rekordy z tabeli newsów, które mają datę większą niż $tart. Teraz połącz je z komentarzami. Tak powstały zbiór pogrupuj po id newsa i policz ile każdy news ma komentarzy. Na koniec posortuj po ilości komentarzy malejąco i wyświetl z tak powstałej tabeli wszystkie pola tabeli newsów oraz ilość komentarzy.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.