2012-12-12 16 views
6

mam rekordy w następujący sposób:Jak wybrać odrębny wartości z jednej kolumny tylko

key | name 
-------------- 
1111 | aa 
1111 | bb  
2222 | cc 

muszę wybrać key i name gdy wartość key różni. Kiedy próbowałem:

select distinct key, name from table; 

mam wszystkie wiersze od zapytanie trwa odrębna dla kombinacji kolumn: key i name. Ale potrzebuję tylko odrębnego key i nie zależy mi na name. Mam dużo płyt, więc potrzebuję praktycznej metody.

Odpowiedz

10

Zapytanie:

SELECT `key`, MAX(`name`) as name 
FROM `table` 
GROUP BY `key` 
0
SELECT key, name FROM table GROUP BY key; 

ta zwraca jeden wiersz dla każdej odrębnej wartości key i wartość name arbitralnie wybrane z rzędów w tej grupie. W praktyce MySQL ma tendencję do zwracania wartości nazwy z wiersza fizycznie przechowywanego najpierw w grupie, ale nie jest to gwarantowane.

Jak pokazują inne odpowiedzi, można umieścić nazwę w wyrażeniu zbiorczym.

0

Jeśli nie dbają o nie, zgrupowanych pól spróbować tej kwerendy -

select key, name from table group by key order by name 

MySQL umożliwia wybranie pola bez użycia funkcji zbiorczą.

zamówienie według nazwy pomaga wybrać imię z grupy.

+0

Wierzę, że to jest nieważne SQL, MySQL altough akceptuje go i zwraca coś. Również to "coś" jest losową nazwą ze zbioru nazw mających ten sam klucz, dlatego wynik nie jest deterministyczny (w zależności od usunięć tabel i wstawień). To nie ma sensu i zachęca do nieporozumień wśród tych, którzy jeszcze nie rozumieją pojęcia agregacji. – colemar

+0

Nie mogę powiedzieć, że jest nieprawidłowy. MySQL na to pozwala i możemy z niego korzystać. Zgadzam się na losowy zapis; powinna istnieć funkcja agregująca lub klauzula ORDER BY, która pomoże wybrać dokładną wartość. Będę edytować moją odpowiedź. – amk

+0

Jest nieważny według ANSI/ISO SQL, ponieważ powoduje niejednoznaczny wynik. MySQL i SQLite są jedynymi implementacjami RDBMS, które pozwalają na tę formę, o ile wiem. Inne produkty RDBMS zwracają błąd. –

2

Dlaczego nie po prostu:

SELECT distinct key 
FROM table 

lub

SELECT key, name 
FROM table 
GROUP BY key 
0

Jak o tym:

select * from table group by key having count(key) = 1 
Powiązane problemy