Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL]Grupowanie sql wyświetlanie najnowszych elementów
arzach
post
Post #1





Grupa: Zarejestrowani
Postów: 332
Pomógł: 6
Dołączył: 27.11.2008

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


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.

Ten post edytował arzach 7.11.2012, 13:12:47
Go to the top of the page
+Quote Post
b4rt3kk
post
Post #2





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

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


  1. SELECT id, MAX(DATA), name FROM tabela GROUP BY id


BTW. id powinien być kluczem unikatowym.


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
arzach
post
Post #3





Grupa: Zarejestrowani
Postów: 332
Pomógł: 6
Dołączył: 27.11.2008

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


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

Ten post edytował arzach 7.11.2012, 20:01:22
Go to the top of the page
+Quote Post
Vion
post
Post #4





Grupa: Zarejestrowani
Postów: 112
Pomógł: 2
Dołączył: 27.06.2008

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


  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

Ten post edytował Vion 7.11.2012, 20:20:39


--------------------
www.zapalara.pl
Go to the top of the page
+Quote Post
arzach
post
Post #5





Grupa: Zarejestrowani
Postów: 332
Pomógł: 6
Dołączył: 27.11.2008

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


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ć ?

Ten post edytował arzach 7.11.2012, 20:29:18
Go to the top of the page
+Quote Post
b4rt3kk
post
Post #6





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

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


  1. SELECT id, MAX(DATA) AS costam, (SELECT name FROM tabela WHERE DATA = costam) AS nazwa FROM tabela GROUP BY id


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
arzach
post
Post #7





Grupa: Zarejestrowani
Postów: 332
Pomógł: 6
Dołączył: 27.11.2008

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


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





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


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





Grupa: Zarejestrowani
Postów: 46
Pomógł: 0
Dołączył: 21.09.2006

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


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ść

Ten post edytował agamemnon 7.11.2012, 22:09:57
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #10





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


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





Grupa: Zarejestrowani
Postów: 65
Pomógł: 1
Dołączył: 19.03.2012
Skąd: Września

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


  1. SELECT * FROM tabela WHERE id ORDER BY DATA DESC
Go to the top of the page
+Quote Post
agamemnon
post
Post #12





Grupa: Zarejestrowani
Postów: 46
Pomógł: 0
Dołączył: 21.09.2006

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


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.

Ten post edytował agamemnon 8.11.2012, 13:32:29
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #13





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


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

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

 



RSS Aktualny czas: 19.08.2025 - 09:14