Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [sql] Wybor tylko unikalnych wartosci
Forum PHP.pl > Forum > Bazy danych
ronin
Witam,
Mam problem z pewnym zapytaniem. Mam tabele zawierajaca kilka kolumn, z czego w jednej kolumnie wiersze sie powtarzaja.
Chcialbym aby zapytanie zwrocilo mi tylko po jednym wierszu dla kazdej wartosci. Bardzo prosze o pomoc.

Pozdrawiam
dr_bonzo
A ktory z wierszy ma zwracac dla kazdej z wartosci [jak sa np 4ry to ktory ma wybrac??]?
No chyba ze chcesz wyciagnac tylko TA jedna kolumne.
phpion
Skorzystaj z DISTINCT:
  1. SELECT DISTINCT kolumna FROM tabela;
ronin
dzieki,

tylko jeszcze jedna rzecz, jesli napisze
Kod
SELECT DISTINCT kolumna FROM
tabela to dostane tylko ta jedna kolumne z unikalnymi wierszami, a mam sytuacje w ktorej jedna kolumna ma wszystkie wiersze unikalne wiec jesli napisze
Kod
SELECT DISTINCT kolumna_z_powtorzeniami, kolumna_bez_powtorzen FROM tabela
to z kolei dostane powtorzone wartosci w kolumnie_z_powtorzeniami a to wlasnie unikalne wartosci tej kolumny mnie interesuja. Jest jakis sposob na to ?

Cytat(dr_bonzo @ 13.07.2008, 20:12:22 ) *
A ktory z wierszy ma zwracac dla kazdej z wartosci [jak sa np 4ry to ktory ma wybrac??]?
No chyba ze chcesz wyciagnac tylko TA jedna kolumne.


moze wybrac dowolny np. pierwszy
phpion
Musisz pamiętać, że DISTINCT działa dla całych wyciąganych rekordów. Jeśli więc normalnie otrzymujesz dane:
Cytat
a | a
a | b
a | c
a | d
b | a
b | b

to DISTINCT tak naprawdę nic Ci nie da ponieważ każdy z tych wierszy różni się od siebie.
ronin
No wlasnie. Zatem jest jakis sposob rozwiazania mojego problemu ?
phpion
Ja osobiście nie do końca rozumiem Twój problem. Może podaj uproszczone dane otrzymywane zwykłym SELECTem oraz te, które chcesz otrzymać finalnie. Chyba w ten sposób będzie najłatwiej znależć skuteczne rozwiązanie.
dr_bonzo
Pytalem przeciez, na jakiek podstawie SQL ma wiedziec ktore kolmny_z_niepowtarzajacymi_sie_wartosciami ma dobrac.

Mozesz zrobic tak: select distinct kolumna_z_powtorzeniami...; i do tego dojoinwac ta tabele raz jeszcze, ew. wrzucic to w podzapytanie; ALE i tak musisz jakos wybrac ktory rekord zwrocic dla danej kolumna_z_powtorzeniami


  1. SELECT r.id, r.code, temp.value FROM repeats r
  2. JOIN ( SELECT r2.id, r2.value FROM repeats r2 ORDER BY r2.value DESC )AS temp ON temp.id = r.id
  3. GROUP BY r.code


ORDER BY r2.value DESC -- tu ustalasz ktory wiersz dostaniesz dla danej wartosci ktora DISTINCtujesz


edit:
no i SQLki do bazki:

  1. CREATE TABLE `test`.`repeats` (
  2. `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  3. `code` INT NOT NULL ,
  4. `value` INT NOT NULL ,
  5. UNIQUE (
  6. `value`
  7. )
  8. ) ENGINE = MYISAM;
  9.  
  10. INSERT INTO `test`.`repeats` (
  11. `id` ,
  12. `code` ,
  13. `value`
  14. )
  15. VALUES (
  16. NULL , '1', '1'
  17. ), (
  18. NULL , '1', '2'
  19. ), (
  20. NULL , '1', '3'
  21. ), (
  22. NULL , '2', '4'
  23. ), (
  24. NULL , '2', '5'
  25. );
Zajec
Tak ja pisali wyżej, nie wiemy które wartości z kolumna_bez_powtorzen są dla Ciebie istotne. Możesz zrobić np. tak:
  1. SELECT kolumna_z_powtorzeniami, MAX(kolumna_bez_powtorzen) FROM tabela GROUP BY kolumna_z_powtorzeniami
Zmiast MAX możesz podstawić inne, np. MIN, AVG.
dr_bonzo
Bez MAX/MIN/.. tez zadziala [ale GROUP musi zostac]
ronin
Cytat(Zajec @ 14.07.2008, 09:28:56 ) *
Tak ja pisali wyżej, nie wiemy które wartości z kolumna_bez_powtorzen są dla Ciebie istotne. Możesz zrobić np. tak:
  1. SELECT kolumna_z_powtorzeniami, MAX(kolumna_bez_powtorzen) FROM tabela GROUP BY kolumna_z_powtorzeniami
Zmiast MAX możesz podstawić inne, np. MIN, AVG.



Nie przeczytaliscie chyba tego co napisalem wczesniej, odpowiedzialem juz na to pytanie, moze sie zle wyrazilem. Sprobuje na przykladzie:

AdresWWW | AdresIP
www.subdomena1.domena1.pl | 83.12.14.5
www.subdomena2.domena1.pl | 83.12.14.5
www.subdomena1.domena2.pl | 83.12.14.6
www.subdomena2.domena2.pl | 83.12.14.6
www.subdomena3.domena2.pl | 83.12.14.6
www.subdomena1.domena3.pl | 83.12.14.12

a chce zwrocic cos takiego:

AdresWWW | AdresIP
www.subdomena1.domena1.pl | 83.12.14.5
www.subdomena1.domena2.pl | 83.12.14.6
www.subdomena1.domena3.pl | 83.12.14.12


czyli mamy sytuacje w ktorym na dany serwer www wskazuje kilka adresow www i mnie nie interesuje ktory adres www zostanie zwrocony, interesuje mnie tylko to, zeby otrzymac wszystkie adresy IP z przypisanymi im adresami www. Jesli bedzie 10 roznych adresow www pokazujacych 10 razy na ten sam adres IP to chce w wyniku otrzymac ten adres IP i jedna dowolna domene ktora na niego pokazuje, nie ma znaczenia ktora.

Pozdrawiam
nospor
No to w czym problem?
  1. SELECT www, ip FROM tabela GROUP BY ip

i juz smile.gif
ronin
MS SQL Server 2000 Query Analyzer:

Cytat
Column 'Tabela.www' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.


w tym.
nospor
na przyszlsoc w tagu tematu okreslaj jaka to baza danych.
Ja pisalem zapytanie dla mysql smile.gif

a najlepiej wkladaj do wlasciwego dzialu... na MS SQL jest wlasciwy dzial
ronin
bede pamietal na przyszlosc smile.gif
ale teraz bardzo chcialbym rozwiazac ten problem smile.gif
dr_bonzo
A moj kod nie dziala? http://forum.php.pl/index.php?s=&showt...st&p=492919
Co prawda dla mysql, ale sobie przepiszesz.
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.