Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Najpopularniejsze newsy
deha21
post 9.03.2010, 11:25:11
Post #1





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
blooregard
post 9.03.2010, 11:28:34
Post #2


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




DATEDIFF
http://dev.mysql.com/doc/refman/5.0/en/dat...nction_datediff


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
deha21
post 9.03.2010, 11:33:20
Post #3





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

Ostrzeżenie: (0%)
-----


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?


--------------------
Go to the top of the page
+Quote Post
blooregard
post 9.03.2010, 11:45:17
Post #4


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




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ę.


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
deha21
post 9.03.2010, 12:03:38
Post #5





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
thek
post 9.03.2010, 15:51:21
Post #6





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
deha21
post 9.03.2010, 17:43:27
Post #7





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
thek
post 9.03.2010, 21:35:51
Post #8





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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ą.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
deha21
post 9.03.2010, 23:20:23
Post #9





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

Ostrzeżenie: (0%)
-----


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.

Ten post edytował deha21 9.03.2010, 22:46:57


--------------------
Go to the top of the page
+Quote Post
thek
post 9.03.2010, 23:52:58
Post #10





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
deha21
post 10.03.2010, 08:14:54
Post #11





Grupa: Zarejestrowani
Postów: 544
Pomógł: 5
Dołączył: 18.08.2009

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
thek
post 10.03.2010, 08:35:32
Post #12





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 23.06.2025 - 13:16