Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Za duże zapytanie
eska
post
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 24.07.2005

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


Witam,

Mam dość duży problem ze skonstruowaniem pewnego zapytania.

Mam dwie tabele:

"produkt"
- produktId
- nazwa
- ...

oraz "komentarz"
- komentarzId
- produktId
- ...
- data

Potrzebuję wybrać 100 ostatnich komentarzy do produktów, pogrupowanych po produktId posortowanych malejąco wg daty ostatniego komentarza.
Czyli jeśli ktoś doda komentarz do danego produktu wędruje on na pierwszą pozycję, a obok pokazuje datę ostatniego komentarza.

Wynikiem ma być mniej więcej coś takiego:
Lp. | nazwa | ostatni komentarz
1. | Produkt nr 1 | 13.04.2009 13:43
2. | Produkt nr 2 | 13.04.2009 11:01
3. | Produkt nr 3 | 12.04.2009 21:12

Nie byłoby to może dużym problemem, gdyby nie rozmiar obu tabel,które zawierają po kilkadziesiąt tysięcy rekordów.

Próbowałem coś takiego:

  1. SELECT produkt.produktId,
  2. produkt.nazwa,
  3. (SELECT dubel.DATA FROM komentarz AS dubel WHERE produkt.produktId = dubel.produktId ORDER BY dubel.DATA DESC LIMIT 1 ) AS ostatniKomentarz
  4. FROM produkt LEFT JOIN komentarz ON produkt.produktId = komentarz.produktId
  5. GROUP BY produkt.produktId
  6. ORDER BY ostatniKomentarz DESC LIMIT 0, 30


Nie wiem czy to jest wina błędnego zapytania, czy wielkości tabel, ale po wywołaniu takiego zapytania, zawiesza mi się przeglądarka, a czasem nawet komp.

Z góry wielkie dzięki za pomoc,
pozdrawiam

Ten post edytował eska 15.04.2009, 15:55:47
Go to the top of the page
+Quote Post
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Lepiej bedzie dodac ci do tabeli produktow pole time_last_comment
i przy dodawaniu komentarza zmieniac jego wartosc na date komentarza.
W momencie usuniecia ostatniego komentarza pobierasz aktualny ostatni komentarz i ustawiasz time_last_comment na nowy.
Go to the top of the page
+Quote Post
eska
post
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 24.07.2005

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


Problem jest w tym, że obie tabele są już dość wypełnione, więc musiałbym i tak pisać skrypt, który po dodaniu pola "time_last_comment" uzupełniłby wartości dla istniejących już wartości.
Go to the top of the page
+Quote Post
wookieb
post
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Ale dzięki temu zyskasz bardzo wiele.
Go to the top of the page
+Quote Post
heaven
post
Post #5





Grupa: Nieautoryzowani
Postów: 92
Pomógł: 15
Dołączył: 21.10.2006

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


Chyba to powinno być szybsze...
  1. SELECT p.produktId, p.nazwa, tab.ostatniKomentarz
  2. FROM produkt p
  3. JOIN (SELECT k .produktId, MAX(k.DATA) AS ostatniKomentarz FROM komentarz k GROUP BY k.produktId) AS tab ON tab.produktId = p.produktId
  4. ORDER BY tab.ostatniKomentarz DESC LIMIT 100


Ten post edytował heaven 16.04.2009, 06:57:43
Go to the top of the page
+Quote Post
eska
post
Post #6





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 24.07.2005

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


mistrzowo heaven,
działa i to bardzo szybko, bardzo mi pomogłeś,
dzięki wielkie
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 24.08.2025 - 00:40