Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MYSQL] Problem z zapytaniem, czyli jak wyciagnąć najnowsze dane z poszczególnych kategorii
tryme
post
Post #1





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 5.12.2005

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


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 (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)

Będę wdzięczny za pomoc w poprawianiu zapytania.
Go to the top of the page
+Quote Post
Lion_87
post
Post #2





Grupa: Zarejestrowani
Postów: 850
Pomógł: 120
Dołączył: 15.02.2007
Skąd: Łódź

Ostrzeżenie: (10%)
X----


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


Ten post edytował Lion_87 8.10.2008, 20:15:12
Go to the top of the page
+Quote Post
tryme
post
Post #3





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 5.12.2005

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


Obecnie wypluwa mi po jednym rekordzie dla każdej z kategorii. Niestety nie są to najnowsze rekordy (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post
drPayton
post
Post #4





Grupa: Zarejestrowani
Postów: 890
Pomógł: 65
Dołączył: 13.11.2005
Skąd: Olsztyn

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


  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 (IMG:http://forum.php.pl/style_emoticons/default/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...

Ten post edytował drPayton 8.10.2008, 20:22:12
Go to the top of the page
+Quote Post
tryme
post
Post #5





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 5.12.2005

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


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) (IMG:http://forum.php.pl/style_emoticons/default/sciana.gif)

Mam bardzo dużo danych, dlatego też wolałbym nie łączyć zapytań.
Go to the top of the page
+Quote Post
Lion_87
post
Post #6





Grupa: Zarejestrowani
Postów: 850
Pomógł: 120
Dołączył: 15.02.2007
Skąd: Łódź

Ostrzeżenie: (10%)
X----


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. ?>
Go to the top of the page
+Quote Post
drPayton
post
Post #7





Grupa: Zarejestrowani
Postów: 890
Pomógł: 65
Dołączył: 13.11.2005
Skąd: Olsztyn

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


Miało być w jednym zapytaniu...
Założyłes indeks na kategorii?
Go to the top of the page
+Quote Post
tryme
post
Post #8





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 5.12.2005

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


Cytat(drPayton @ 8.10.2008, 20:47:46 ) *
Założyłes indeks na kategorii?

Tak, indeks jest założony.
Go to the top of the page
+Quote Post
VGT
post
Post #9





Grupa: Zarejestrowani
Postów: 63
Pomógł: 9
Dołączył: 19.11.2004
Skąd: Iława

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


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
Go to the top of the page
+Quote Post
Pilsener
post
Post #10





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


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 (IMG:http://forum.php.pl/style_emoticons/default/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.
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 - 22:52