Váš dotaz je zcela legální syntaxe, můžete seřadit podle sloupců, které nejsou přítomny ve výběru.
- Ukázka práce s MySQL
- Ukázka práce se serverem SQL
- Pracovní ukázka s Postgresql
- Ukázka práce s SQLite
- Ukázka práce s Oracle
Pokud potřebujete úplné specifikace o právním uspořádání, ve standardu SQL 2003 má dlouhý seznam příkazů o tom, co by příkaz měl a neměl obsahovat, (02-Foundation, strana 415, oddíl 7.13
Domnívám se, že váš zmatek může být způsoben výběrem a/nebo řazením podle sloupců, které nejsou přítomny ve skupině podle, nebo řazením podle sloupců, které nejsou ve výběru při použití odlišných.
Oba mají stejný základní problém a MySQL je jediný, pokud vím, který to umožňuje.
Problém je v tom, že při použití seskupit podle nebo rozlišit nejsou potřeba žádné sloupce, které nejsou obsaženy ani v jednom, takže nezáleží na tom, zda mají více různých hodnot v řádcích, protože nejsou nikdy potřeba. Představte si tento jednoduchý soubor dat:
ID | Column1 | Column2 |
----|---------+----------|
1 | A | X |
2 | A | Z |
3 | B | Y |
Pokud napíšete:
SELECT DISTINCT Column1
FROM T;
Dostanete
Column1
---------
A
B
Pokud potom přidáte ORDER BY Column2
, který ze dvou sloupců 2 byste použili k seřazení A, X nebo Z? Není deterministické, jak vybrat hodnotu pro sloupec2.
Totéž platí pro výběr sloupců, které nejsou ve skupině podle. Pro zjednodušení si představte první dva řádky předchozí tabulky:
ID | Column1 | Column2 |
----|---------+----------|
1 | A | X |
2 | A | Z |
V MySQL můžete psát
SELECT ID, Column1, Column2
FROM T
GROUP BY Column1;
To ve skutečnosti porušuje standard SQL, ale funguje to v MySQL, ale problém je, že to není deterministické, výsledek:
ID | Column1 | Column2 |
----|---------+----------|
1 | A | X |
Není více ani méně správné než
ID | Column1 | Column2 |
----|---------+----------|
2 | A | Y |
Takže to, co říkáte, je dát mi jeden řádek pro každou odlišnou hodnotu Column1
, které obě sady výsledků splňují, jak tedy víte, kterou získáte? No nemáte, zdá se, že je to docela populární mylná představa, že můžete přidat a ORDER BY
klauzule k ovlivnění výsledků, takže například následující dotaz:
SELECT ID, Column1, Column2
FROM T
GROUP BY Column1
ORDER BY ID DESC;
Zajistí, že získáte následující výsledek:
ID | Column1 | Column2 |
----|---------+----------|
2 | A | Y |
kvůli ORDER BY ID DESC
, to však není pravda (jak je ukázáno zde
).
dokumenty MySQL stav:
Takže i když máte objednávku, toto neplatí, dokud nebude vybrán jeden řádek na skupinu a tento jeden řádek není určující.
Standard SQL povoluje sloupce ve výběrovém seznamu, které nejsou obsaženy v GROUP BY nebo agregační funkci, avšak tyto sloupce musí být funkčně závislé na sloupci v GROUP BY. Z SQL-2003-Standard (5WD-02-Foundation-2003-09 - strana 346) - http ://www.wiscorp.com/sql_2003_standard.zip
Například ID ve vzorové tabulce je PRIMÁRNÍ KLÍČ, takže víme, že je v tabulce jedinečný, takže následující dotaz odpovídá standardu SQL a běžel by v MySQL a selhal by v současné době v mnoha DBMS (V době psaní Postgresql je nejbližší DBMS, kterou znám ke správné implementaci standardu - Příklad zde ):
SELECT ID, Column1, Column2
FROM T
GROUP BY ID;
Protože je ID pro každý řádek jedinečné, Column1
může mít pouze jednu hodnotu pro každé ID jednu hodnotu Column2
neexistuje žádná nejednoznačnost ohledně toho, co vrátit pro každý řádek.