Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MYSQL] Problem z zapytaniem
Forum PHP.pl > Forum > Przedszkole
tryme
Witam,

Czy możliwe jest, abym w jednym zapytaniu wyciągnął po jednym najnowszym rekordzie z tabeli dla każdej z kategorii z osobna?

Tabela przykładowo wygląda tak: id, tekst, kategoria

Pytanie mniej więcej ma wyglądać tak (tak mi się przynajmniej wydaje):
  1. SELECT * FROM tabela GROUP BY kategoria ORDER BY id DESC

ale nie działa. Pokazuje dane lecz nie najnowsze sad.gif

Będę wdzięczny za pomoc w poprawianiu zapytania.
Lion_87
A co pokazuje?

Moze daj
  1. LIMIT 1
na koniec zapytania

EDIT: sorry zle zrozumialem wiec o tym zapomnij
Cytat
Moze daj
  1. LIMIT 1
na koniec zapytania
tryme
Obecnie wypluwa mi po jednym rekordzie dla każdej z kategorii. Niestety nie są to najnowsze rekordy sad.gif
drPayton
  1. SELECT * FROM tabelka WHERE id IN (SELECT max(id) FROM tabelka GROUP BY category) GROUP BY category ORDER BY id DESC


Jestem pewien, że da się lepiej, ale póki nikt mądrzejszy się nie wypowie masz taki (działający) przykład winksmiley.jpg

edit:
  1. SELECT * FROM tabelka WHERE id IN (SELECT max(id) FROM tabelka GROUP BY category) ORDER BY id DESC

Grupowanie w głównym zapytaniu jest tu niepotrzebne...
tryme
Cytat(drPayton @ 8.10.2008, 19:20:53 ) *
  1. SELECT * FROM tabelka WHERE id IN (SELECT max(id) FROM tabelka GROUP BY category) ORDER BY id DESC

Grupowanie w głównym zapytaniu jest tu niepotrzebne...

Pomysł byłby ok, gdyby nie 8 rows in set (1 min 44.95 sec) sciana.gif

Mam bardzo dużo danych, dlatego też wolałbym nie łączyć zapytań.
Lion_87
Moze to CI sie przyda

  1. <?php
  2. $zapytanie = "SELECT DISTINCT(kategoria) FROM tabela";
  3.  $wynik = mysql_query($zapytanie);
  4.  $ilosc = mysql_num_rows($wynik);
  5. for ($i=0; $i<$ilosc; $i++)
  6.    {
  7.   $pokaz = mysql_fetch_array($wynik);
  8.   $SELECTDISTINCTkategoria = $pokaz['DISTINCT(kategoria)'];
  9.  
  10. $zapytanie2 = "SELECT * FROM tabela where kategoria='$SELECTDISTINCTkategoria' order by kategoria desc LIMIT 1";
  11.  $wynik2 = mysql_query($zapytanie2);
  12.     $dane = mysql_fetch_array($wynik2);
  13.     $ostatnie_id = $dane['id'];
  14.  
  15. echo "$ostatnie_id";
  16.    
  17. }
  18. ?>
drPayton
Miało być w jednym zapytaniu...
Założyłes indeks na kategorii?
tryme
Cytat(drPayton @ 8.10.2008, 20:47:46 ) *
Założyłes indeks na kategorii?

Tak, indeks jest założony.
VGT
Tez kiedys tego potrzebowalem i doszedlem do jednego rozwiazania, ktore niestety takze nie bylo zadowalajace pod wzgledem wydajnosci:

Przy grupowaniu mysql zwraca pierwszy napotkany rekord z kazdej kategorii, wiec stwierdzilem ze trzeba mu je podac w odpowiedniej kolejnosci aby uzyskac to, co chce:
  1. SELECT `tekst`, `kategoria` FROM (SELECT * FROM `table` ORDER BY id DESC) AS temp GROUP BY kategoria


Jednak brak wydajnosci sklonil mnie do zostosowania wiecej zapytan + cache wyniku
Pilsener
Proponuję zapoznać się z HAVING - działa jak WHERE, tyle tylko że dla grupowania. Dziwne, że na tym forum szukajka zwraca 0 wyników na to słowo winksmiley.jpg

Przykład:
  1. SELECT id_klienta, avg(sztuk) FROM zakupy GROUP BY id_klienta HAVING avg(sztuk)>10
- wyświetli listę klientów, którzy zamówili co najmniej 10 sztuk, obojętnie czego.
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.