Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Za duże zapytanie
Forum PHP.pl > Forum > Bazy danych > MySQL
eska
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
wookieb
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.
eska
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.
wookieb
Ale dzięki temu zyskasz bardzo wiele.
heaven
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
eska
mistrzowo heaven,
działa i to bardzo szybko, bardzo mi pomogłeś,
dzięki wielkie
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.