Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] grupowanie wyników
Forum PHP.pl > Forum > Przedszkole
webspy
Witam,

Czy istenieje możliwość pogrupowania wyników z tabeli w taki sposób, że jeśli jest więcej takich samych to pokazuje drugi wynik a nie pierwszy czy ostatni?

Tabela:

Nazwa------------data--------------numer
krzysztof------2012-12-11-----------7
Adam------------2012-12-10------------7
Adam------------2012-10-10------------7
Adam------------2012-5-10------------4


group by numer numer ASC

Czy dam ASC czy DESC to i tak pokazuje wynik z brzegu albo pierwszy albo ostatni jak wyciągnąć wynik 2 od góry?

Na początku robiłem dwa osobne zapytania które grupowały a potem szukały drugiego wyniku przez LIMIT 1,1 lecz to nie sprawdza się bo potrzebuję wyświetlić kilka wyników w pętli a to moje pierwsze działało przy jednym wyniku.
kristaps
A koniecznie musi to być zapytanie? Z pętlą nie byłoby problemu - wyświetlałbyś sumę wszystkich rekordów i pomijał te które chcesz.
Kshyhoo
Nie do końca rozumiem, co chcesz osiągnąć.
  1. SELECT id, numer, DATA, nazwa
  2. FROM tabela
  3. GROUP BY DATA
  4. ORDER BY numer ASC
  5. LIMIT 1,10
webspy
Cytat(kristaps @ 19.12.2012, 09:54:59 ) *
A koniecznie musi to być zapytanie? Z pętlą nie byłoby problemu - wyświetlałbyś sumę wszystkich rekordów i pomijał te które chcesz.


I tak właśnie zrobiłem przez pętle, lecz to nie jest zbyt optymalne, w jednym zapytaniu byłoby to lepsze i szybsze ale trzeba sobie jakoś radzić smile.gif ważne że działa tak jak chce.

Jakby ktoś miał jakiś pomysł to może coś wymyśli jak to rozwiązać w jednym zapytaniu, próbowałem podzapytania zrobić ale się pogubiłem i nic z tego nie wyszło.

Pozdrawiam.

Cytat(Kshyhoo @ 19.12.2012, 11:49:05 ) *
Nie do końca rozumiem, co chcesz osiągnąć.
  1. SELECT id, numer, DATA, nazwa
  2. FROM tabela
  3. GROUP BY DATA
  4. ORDER BY numer ASC
  5. LIMIT 1,10



Mam w tabeli dane jakiegoś gościa jest w niej imie, data, nr, tresc, wyświetlam wszystkie dane z bazy i grupuje je według kolumny nr nastepnie sortuje kolejno imie ASC, nr ASC
Wynik ładnie pięknie pokazuje wszystkie wiersze bez powtórzeń: nr tylko, że pokazuje ostatni wiersz z grupowanej kolumny:

Krzysztof-------------5---------------treść1 -> po zmianie nr DESC pokazuje ten wynik
Krzysztof-------------5---------------treść2 -> chcę aby po grupowaniu pokazywało ten wynik zawsze drugi od góry (w jednym zapytaniu to robię nr = '5' ORDER BY data ASC
Krzysztof-------------5---------------treść3
Krzysztof-------------5---------------treść4
Krzysztof-------------5---------------treść5 -> po grupowaniu pokazuje ten wynik
Kshyhoo
Pokaż zapytanie...
webspy
Kod
SELECT * FROM tabela group by nr ORDER BY `data` ASC


1wiersz--------nr2-------|
2wiersz--------nr2-------| Po grupowaniu pokazuje 1wiersz lub 3 wiersz (czyli pierszy albo ostatni) a jak wyciągnąć z grupowania ten 2wiersz?
3wiersz--------nr2-------|
Kshyhoo
  1. LIMIT 1, 3

Pominie zerowy index zapytania.
webspy
Cytat(Kshyhoo @ 19.12.2012, 12:25:49 ) *
  1. LIMIT 1, 3

Pominie zerowy index zapytania.



Tak tylko że pokaże drugi rekord z 3, tak?

TYlko że jak mam w tabeli:

1wiersz---------nr2------------tresc1gsdfgsdfg
2wiersz---------nr2------------tresc12sfdgsf -> Grupowanie pokazuje ten wynik
3wiersz---------nr4------------tresc14sfdg
4wiersz---------nr2------------tresc13gsfdg
5wiersz---------nr4------------tresc24sfgsf -> Grupowanie pokazuje ten wynik
6wiersz---------nr2------------tresc14sfg
7wiersz---------nr5------------tresc134sfdg
8wiersz---------nr5------------tresc1qesdfsdf -> Grupowanie pokazuje ten wynik

Czyli wyświetli: 2wiersz, 5wiersz, 8wiersz

mmmmmmm
Zapytanie masz do dupy.
NIE WOLNO dawać * w połączeniu z GROUP BY. Zwłaszcza, że nie grupujesz po polu unikalnym
webspy
Cytat(mmmmmmm @ 19.12.2012, 12:38:18 ) *
Zapytanie masz do dupy.
NIE WOLNO dawać * w połączeniu z GROUP BY. Zwłaszcza, że nie grupujesz po polu unikalnym



To nawet jak nie dam tego * to jak zrobić aby rozwiązać mój problem?

Grupowanie działa i wyświetla prawidłowo tylko chce wyciągnąć jak pisałem wyżej 2 wynik z grupy.

Jak mam 30 takich samych wyników to grupuje do jednego i wyświetla pierwszy lub ostatni wiersz z grupy.


Rozwiązałem ten problem i działa jak chce tylko jako w 2 zapytaniach i z wykorzystaniem pętli.

mmmmmmm
Cytat(webspy @ 19.12.2012, 12:46:08 ) *
Jak mam 30 takich samych wyników to grupuje do jednego i wyświetla pierwszy lub ostatni wiersz z grupy.

Przypadek...
Cytat za manualem:
Cytat
12.11.3. GROUP BY and HAVING with Hidden Fields
MySQL extends the use of GROUP BY so that you can use non-aggregated columns or calculations in the SELECT list that do not appear in the GROUP BY clause. You can use this feature to get better performance by avoiding unnecessary column sorting and grouping. For example, you do not need to group on customer.name in the following query:

SELECT order.custid, customer.name, MAX(payments)
FROM order,customer
WHERE order.custid = customer.custid
GROUP BY order.custid;

In standard SQL, you would have to add customer.name to the GROUP BY clause. In MySQL, the name is redundant.

Do not use this feature if the columns you omit from the GROUP BY part are not constant in the group. The server is free to return any value from the group, so the results are indeterminate unless all values are the same.

A similar MySQL extension applies to the HAVING clause. The SQL standard does not allow the HAVING clause to name any column that is not found in the GROUP BY clause if it is not enclosed in an aggregate function. MySQL allows the use of such columns to simplify calculations. This extension assumes that the non-grouped columns will have the same group-wise values. Otherwise, the result is indeterminate.

Popraw zapytanie, aby było prawidłowe, to ci potem pomogę.
webspy
Cytat(mmmmmmm @ 19.12.2012, 12:50:32 ) *
Przypadek...
Cytat za manualem:

Popraw zapytanie, aby było prawidłowe, to ci potem pomogę.



OK, posiedzę nad tym smile.gif

Pierwsze proste zapytanie które grupuje pole numer

  1. SELECT numer FROM tabela GROUP BY numer



Zapytanie z manuala:

  1. SELECT tabela.numer, tabela.imie, MAX(numer) FROM tabela WHERE tabela.numer = tabela.numer GROUP BY tabela.numer


Działa, tylko, że jak to ma się do tego fragmentu "SELECT order.custid, customer.name" to są dwie osobne tabele? jak to interpretować?


I co dalej z tym zrobić, rozumiem, że te MAX po coś tu jest i trzeba go gdzieś wykorzystać dalej.





Będę potrzebował jeszcze HAVING?
mmmmmmm
Havinga chyba nie będziesz potrzebować. Having to taki WHERE, ale na zapytaniach agregujących (na ich wynikach)
  1. SELECT tabela.numer, tabela.imie, MAX(numer) FROM tabela WHERE tabela.numer = tabela.numer GROUP BY tabela.numer

Prawie idealnie...
  1. SELECT t.numer, t.imie, MAX(t.numer) max_numer FROM tabela AS t GROUP BY t.numer, t.imie

Poprawki:
1. Nadane aliasy na tabelę i jedno pole
2. dodane drugie pole do grupowania (zgodnie z manualem, który poprzednio wkleiłem nie może być inncyh pól niż te wymienione w GROUP BY + agregaty)
3. Wywaliłem WHERE, bo było idiotyczne

i teraz masz wyniki
1 Adam 7
2 Olaf 3
3 Ela 7
4 Ada 4

Jeśli chcesz je posortować malejąco wg 3 kolumny (max_numer), to na końcu zapytania dodajesz: ORDER BY 3 DESC
1 Adam 7
3 Ela 7
4 Ada 4
2 Olaf 3

Co dalej chcesz zrobić nie wiem...
_krc_
Cudo optymalizacji to to nie jest ale chyba wykonuje to co chciales:
  1. SELECT
  2. id, name, max(date), result
  3. FROM
  4. wyniki
  5. WHERE id NOT IN (
  6. SELECT id FROM (
  7. SELECT id, max(date) FROM (
  8. SELECT id, name, date, result FROM wyniki ORDER BY date DESC
  9. ) AS dummy1
  10. GROUP BY
  11. result
  12. ) AS dummy2
  13. )
  14. GROUP BY
  15. result
  16. ORDER BY
  17. date DESC
mmmmmmm
Ale jest źle...
Wiersze 7-11. Masz grupowanie po result, którego nie ma w SELECT, za to jest ID, którego nie ma w GROUP BY.
I po co tam sortowanie? Bez sensu...
_krc_
poprostu zamien nazwy kolumn, z sortowaniem masz racje nie sa potrzebne, byly tylko w celach pomocowych przed grupowaniem..
webspy
Nie było mnie ostatnio na kompie, patrze na te przykłady i sprawdzam ale to nie działa jak bym chciał.
Może opisze dokładniej o co mi chodzi z tymi wynikami.

------------------------------------------------------------
id--------------personalia------------nr-------------adres-------------------email------------------tel----------------tresc---------------------------
10--------------Krzysztof------------PP 777--------ul. adresowa-----------email@email---------888888----------Tresc nr 1-----------------------pokazuje ten
9--------------Krzysztof------------PP 777--------ul. adresowa-----------email@email---------888888----------Tresc nr 2-----------------------chce aby pokazywalo ten drugi
8--------------Krzysztof------------PP 777--------ul. adresowa-----------email@email---------888888----------Tresc nr 1-----------------------
7--------------Krzysztof------------PP 777--------ul. adresowa-----------email@email---------888888----------Tresc nr 2-----------------------
6--------------Krzysztof------------PP 777--------ul. adresowa-----------email@email---------888888----------Tresc nr 1-----------------------
5--------------Dominik------------PP 1111--------ul. adresowa11-------------------------------888888----------Tresc ppp-----------------------pokazuje ten
4--------------Dominik------------PP 1111--------ul. adresowa11-------------------------------888888----------Tresc kkk-----------------------chce aby pokazywalo ten drugi
3--------------Dominik------------PP 1111--------ul. adresowa11-------------------------------888888----------Tresc ppp-----------------------
2--------------Dominik------------PP 1111--------ul. adresowa11-------------------------------888888----------Tresc kkk-----------------------
1--------------Dominik------------PP 1111--------ul. adresowa11-----------------------------888888----------Tresc ppp-----------------------



Grupuje przez kolumne nr

Wynik wyświetla mi
10--------------Krzysztof------------PP 777--------ul. adresowa-----------email@email---------888888----------Tresc nr 1-----------------------
5--------------Dominik------------PP 1111--------ul. adresowa11-------------------------------888888----------Tresc ppp-----------------------

Chciałbym uzyskać wynik
9--------------Krzysztof------------PP 777--------ul. adresowa-----------email@email---------888888----------Tresc nr 2-----------------------
4--------------Dominik------------PP 1111--------ul. adresowa11-------------------------------888888----------Tresc kkk-----------------------

Głównie chodzi o kolumne tresc aby pokazywało wynik który dodano do bazy o jeden wcześniej

Chce mieć też wszystkie dostępne kolumny do wyświetlania wyniku.

taki pogladowy kod:
while(....) {
echo '
Imię: Krzysztof $wiersz['personalia'];
Nr: PP 777 $wiersz['nr'];
Adres: ul. adresowa $wiersz['adres'];
email: email@email $wiersz['email'];
tel: 888888 $wiersz['tel'];
tresc: Tresc nr 2 $wiersz['tresc'];
';
}
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.