tomzoll
21.05.2013, 09:53:59
Cześć. Mam taki problem i nie wiem jak to obejść. Mam tabelę Obserwacje o takiej strukturze:
ID, Gatunek, Kwadrat, Kategoria, Obserwator
a w niej rekordy:
1,Ptak,AA22,C1,Marek
2,Ssak,BB22,D3,Stachu
3,Ptak,AA22,C10,Jarek
4,Płaz,AB32,H1,Maria
5,Ptak,AB44,G1,Stachu
Chcę skonstruować takie zapytanie aby mi zwróciło rekordy w takiej postaci:
2,Ssak,BB22,D3,Stachu
3,Ptak,AA22,C10,Jarek
4,Płaz,AB32,H1,Maria
5,Ptak,AB44,G1,Stachu
tj. aby gatunek był unikalny w danym kwadracie (a jednocześnie żeby była wyswietlona tylko i wyłącznie jedna najwyższe kategoria w danym kwadracie (z uwzględnieniem sortowania alfabetycznego)
Próbowałem wykonać takie zapytanie: SELECT DISTINCT Gatunek, kwadrat from Obserwacje . Wszystko niby ok. poza jednym wyjątkiem: nie wyświetla mi kolumn: ID, Kategoria oraz Obserwator
Czy ktoś mógłby mi pomóc z tym problemem ?
Z góry dziękuję i pozdrawiam
alegorn
21.05.2013, 11:06:05
po pierwsze poczytaj o normalizacji tabel. mysle ze gdybys zastosowal sie do tych zasad, problem zapytan bylby o wiele mniejszy.
po drugie:
SELECT DISTINCT Gatunek, kwadrat FROM Obserwacje
Cytat
Wszystko niby ok. poza jednym wyjątkiem: nie wyświetla mi kolumn: ID, Kategoria oraz Obserwator
zobacz co napisales w zapytaniu, polecenie brzmi :
wyświetl unikaty zbiorów dla pól GATUNEK i KWADRAT z tabeli..więc dlaczego się dziwisz, że nie wyświetla ci pól ID, Kategoria oraz Obserwator, skoro o nie nie prosisz....
proponuje kurs sql
popraw mnie jeśli się mylę wydaje mi sie ze nie jestes programista, i nie masz ambicji nim byc, a robisz to z potrzeby (fascynacji potrzeba

)
napisz, na ile elastyczna jest ta struktura którą posiadasz, czy można by było ingerować w nią.
jesli nie - coś wymyślimy, na tym co masz, ale nie będą to optymalne zapytania...
j.
tomzoll
22.05.2013, 10:00:27
Cytat
po pierwsze poczytaj o normalizacji tabel. mysle ze gdybys zastosowal sie do tych zasad, problem zapytan bylby o wiele mniejszy.
Czepiłeś się, że nie wpisałem w miejscach kwadratów, gatunków itp, że są wstawiane id pobrane z powiązanych tabel a jest wpisany zwykły tekst... Bazę mam optymalną, tylko zwyczajnie nie miałem czasem na opisywanie całej struktury tutaj na forum, bo nie o to chodzi w moim poście...

Ale, żeby nie było offtop, kontynuuję

Tak, wiem, że w powyższym zapytaniu DISTINCT nie proszę o dane, które mi są potrzebne, ale poprosiłem o pomoc, jak skonstruować zapytanie aby te dane zostały zwrócone.
Dodam też, że próbowałem:
Kod
SELECT id, id_gatunku, id_kwadratu, max(id_kategorii), id_obserwatora GROUP BY id_gatunku, id_kwadratu
ale znowu zwraca mi głupoty...
mmmmmmm
22.05.2013, 10:23:57
Na początek proponuję wykonać zapytanie:
SELECT gatunek, kwadrat, max(id) FROM tabela GROUP BY gatunek;
Potem proponuję wykonać takie zapytanie (takie samo):
SET @@session.sql_mode='ONLY_FULL_GROUP_BY';
SELECT gatunek, kwadrat, max(id) FROM tabela GROUP BY gatunek;
Potem proponuję sięgnąć po jakiś podręcznik (porządny) do ANSI SQL (broń Boże do MySQL!) i nauczyć się porządnie SQL.
A rozwiązanie Twego problemu to:
SELECT t.* FROM tabela t NATURAL JOIN (SELECT gatunek, kwadrat, max(kategoria) kategoria FROM tabela GROUP BY 1,2)x