Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Grupowanie sql wyświetlanie najnowszych elementów
Forum PHP.pl > Forum > Przedszkole
arzach
Witam mam taką tabelkę
ID data name
1 2012.11.06 a
1 2012.11.03 b
1 2012.11.07 c
1 2012.11.08 d
1 2012.11.05 e
2 2012.11.11 f
2 2012.11.13 g
2 2012.11.08 h
2 2012.11.08 i
2 2012.11.20 j
3 2012.11.11 k
3 2012.11.13 m
3 2012.11.08 n
3 2012.11.08 o
3 2012.11.20 p
3 2012.11.08 r

I grupuje ją po id
Czyli
  1. SELECT id, DATA, name FROM tabela GROUP BY id


I jak zrobić grupowanie żeby kolumny zwracały najnowszą wartość według daty ?

Wynik jaki chcę trzymać

ID data name
1 2012.11.08 d
2 2012.11.20 j
3 2012.11.13 m

Próbowałem coś z
  1. SELECT id, DATA, name FROM tabela WHERE MAX(DATA) GROUP BY id

ale nie działa.
b4rt3kk
  1. SELECT id, MAX(DATA), name FROM tabela GROUP BY id


BTW. id powinien być kluczem unikatowym.
arzach
Gdyby o to chodziło to bym nie pisał robiłem tak wcześniej i nie działa
Jedynie MAX(data) jest ok ale reszta wartości nie pasuje
Ktoś ma jakiś pomysł questionmark.gif
Vion
  1. SELECT id, name, max(DATA) FROM tabela
  2. GROUP BY id
  3. HAVING MAX( DATA )
  4. LIMIT 0 , 30


napisz czy zadziałało
arzach
Nie działa

Chodzi mi o to że chce pogrupować po ID ponieważ chce pobrać po jednym najnowszym rekordzie z danego id i wszystkie te zapytanie co podaliście nie działają. Pobranie za pomocą MAX(data) nic nie daje ponieważ data nieodpowiadana danemu name
Czyli
Takie zapytanie
  1. SELECT id, MAX(DATA), name FROM tabela GROUP BY id

zwróci

1 2012.11.08 a
2 2012.11.20 f
3 2012.11.13 k

Czyli jak widać name nie odpowiada maksymalnej dacie

A ja chce dostać taki wynik

1 2012.11.08 d
2 2012.11.20 j
3 2012.11.13 m

Wie ktoś jak to zrobić ?
b4rt3kk
  1. SELECT id, MAX(DATA) AS costam, (SELECT name FROM tabela WHERE DATA = costam) AS nazwa FROM tabela GROUP BY id
arzach
Podzapytanie odpada.
Bo co w przypadku gdy będzie więcej kolumn niż tylko name ?
Dla każdej kolumny podzapytanie ? Sposób raczej bardzo mało wydajny
Ktoś ma jakieś propozycje jeszcze ? Ta tabelka co podałem to jest tylko przykład by było wiadome o co mi chodzi.
mmmmmmm
  1. SELECT t.* FROM tabela t JOIN (SELECT id, Max(DATA) DATA FROM tabela GROUP BY id) x ON x.id=t.id AND x.DATA=t.DATA
agamemnon
A w jaki sposób dokonać takiego grupowania kiedy tworzymy kwerendę?

  1. SELECT `id_pracownika` , `godzina` , `stanowisko` , `dzien_tygodnia` ,
  2. (`godzina` -8) AS `Liczba`
  3. FROM plan
  4. WHERE `id_pracownika` NOT
  5. IN (
  6.  
  7. SELECT `id_pracownika`
  8. FROM plan
  9. WHERE `dzien_tygodnia` =2
  10. AND `godzina` =8
  11. )
  12. AND `dzien_tygodnia` =2
  13. ORDER BY `Liczba`


Wynikiem tego zapytania jest


id_pracownika/ godzina/ stanowisko / dzien_tygodnia/ Liczba/
38/ 1/ 15/ 2/ 1/
41/ 1/ 11/ 2/ 1/
38/ 2/ 31/ 2/ 2/
41/ 1/ 26/ 2/ 2/
38/ 3/ 26/ 2/ 3/

Idea jest taka aby id_pracownika "zwrócił" dla każdego pracownika z najniższym wynikiem w polu Liczba
id_pracownika/ godzina/ stanowisko / dzien_tygodnia/ Liczba/
38/ 1/ 15/ 2/ 1/
41/ 1/ 11/ 2/ 1/

Używając group by id_pracownika nie mam pewności czy to rzeczywiście jest najniższa wartość
mmmmmmm
  1. SELECT p.`id_pracownika` , p.`godzina` , p.`stanowisko` , p.`dzien_tygodnia` , (p.`godzina` -8) AS `Liczba`
  2. FROM plan p JOIN (
  3. SELECT `id_pracownika` , Min(`godzina`) AS `godzina`
  4. FROM plan
  5. WHERE `id_pracownika` NOT
  6. IN (
  7. SELECT `id_pracownika`
  8. FROM plan
  9. WHERE `dzien_tygodnia` =2
  10. AND `godzina` =8
  11. )
  12. AND `dzien_tygodnia` =2
  13. GROUP BY id_pracownika
  14. ) AS Sub
  15. ON Sub.id_pracownika=p.id_pracownika AND p.godzina=Sub.godzina
kalafior122
  1. SELECT * FROM tabela WHERE id ORDER BY DATA DESC
agamemnon
mmmmmmm - to zapytanie nie zwraca pojedynczych rekordów id_pracownika.
Użycie
  1. MIN(`godzina`)
zakłamie wyniki bo nie zawsze szukamy pracownika który pracuje najwcześniej.
Np. pracownik ma godzinę 6,7,8,9 a potrzebujemy kogoś na 10 to zapytanie zwroci 6.
  1. (`godzina`-8) AS Liczba
ma za zadanie znaleźć pracowników którzy będą "najbliżej poszukiwanej" godziny (w tym przypadku ósmej)

Gdyby dało się wyrzcić pracowników z "Liczba" najbliższym zera to by mnie satysfakcjonowało.
mmmmmmm
Ja tylko ci pokazałem, jak ma wyglądać zapytanie. Roboty za ciebie odwalać nie będę. Choć i tak już z 3/4 tego zapytania napisałem....
A skoro zwraca duble, to znaczy że albo coś źle napisałem (prawie niemożliwe), albo źle przepisałeś, albo masz duble w bazie...
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.