Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Select DISTINCT
Forum PHP.pl > Forum > Przedszkole
majestiq
  1. SELECT * FROM `test_1` WHERE id NOT IN (SELECT DISTINCT href FROM `test_1`)


Powinno zwrócić rekordy, które w polu 'href' mają taką samą wartość, a zwraca wszystkie rekordy !
Wcześniej mi to działało raczej i nie wiem o co chodzi.

W tabeli 'test_1' są na pewno zdublowane wiersze (identyczna zawartość 'href').


Struktura tabeli wygląda tak:

Kod
id    int(11)    
href     text    
checked    tinyint(1)    
status    tinyint(1)


Co robie źle questionmark.gif?
nospor
w podselect zwracasz href, a w warunku sprawdzasz id. PRzeciez to dwie rozne kolumny.

Cytat
Powinno zwrócić rekordy, które w polu 'href' mają taką samą wartość, a zwraca wszystkie rekordy
Ze niby ktora czesc zapytania ma to robic? Distinct usuwa zdublowany rekordy a nie zwraca rekordy ktore mają taką samą wartosc
majestiq
Całe to zapytanie miało zwrócić część wspólną (rekordy powtórzone przynajmniej raz).

Zmieniłem to id na href:

  1. <?php
  2. SELECT * FROM `test_1` WHERE href not in (SELECT DISTINCT href FROM `test_1`)
  3. ?>


i dalej jest lipka - zwraca pusty wynik a jak mówie napewno sa powtó¶zone rekordy, tzn kilka rekordów ma napewno taką
samą wartość w polu href.
nospor
ale ty nadal nie rozumiesz...

pozdaytanie zwraca ci wszystkie href a w zapytaniu glownym chcesz by zwrocil ci rekordy, ktorych href nie ma w podzapytaniu. Ale w podzapytaniu są wszystkie href wiec w rezultacie dostajesz nic. Naprawde tego nie rozumiesz? Przetraw to na spokojnie

A jak chcesz pobrac href, ktore występuja tylko raz, to uzyj group by i count

Cytat
Całe to zapytanie miało zwrócić część wspólną (rekordy powtórzone przynajmniej raz).
Do tego tez uzyj group by i count smile.gif

zreszta masz linka:
Temat: Wybranie powtarzajacych sie danych w kolumnie
majestiq
mniej więcej rozumiem, ale dlaczego podzapytanie: SELECT DISTINCT href FROM `test_1`
zwraca mi wszystkie wiersze ?

DISTINCT powinno zwrócić wszystkie wiersze z pominięciem tych które są zdublowane, więc czemu działa tak
samo jak: SELECT href FROM `test_1` questionmark.gif

Proszę, zmodyfkuj ten kod tak jak Ty byś to zrobił, żeby osiągnąć efekt o który mi chodzi.
nospor
podalem ci rozwiązanie, podalem ci linka gdzie masz to zrobione. skorzystaj.

Olej distinct bo widze wogole nie trawisz co sie do ciebie mowi. Juz ci to wyjasnilem w poprzednim poscie dlaczego ci nie dziala a ty dalej by to wyjasniac.... smile.gif

edit:
Cytat
SELECT DISTINCT href FROM `test_1`
zwraca mi wszystkie wiersze
On nie zwraca wszystkich wierszy, a wszystkie href - to jest subtelna roznica. Ale ty potem w glownym zapytaniu i tak lecisz po href, wiec de fakto nic nie dostajesz bo wykluczasz wszystkie href
majestiq
Cytat(nospor @ 8.08.2008, 09:27:02 ) *
podalem ci rozwiązanie, podalem ci linka gdzie masz to zrobione. skorzystaj.


Sory nie zauważyłem.

[quote]
Olej distinct bo widze wogole nie trawisz co sie do ciebie mowi. Juz ci to wyjasnilem w poprzednim poscie dlaczego ci nie dziala a ty dalej by to wyjasniac.... smile.gif
(...)
On nie zwraca wszystkich wierszy, a wszystkie href - to jest subtelna roznica. Ale ty potem w glownym zapytaniu i tak lecisz po href, wiec de fakto nic nie dostajesz bo wykluczasz wszystkie href
[quote]

No, ale nie wyjaśniłeś dlaczego ten distinct w podzapytaniu zwraca wszystkie href a nie pomija tych które są zdublowane.
NIe chce się na siłe upierać przy czymś, ale mi to wcześniej jak najbardziej działało z tym, że wtedy to była inna tabela i tam po id jechałem,
ale zwracało mi powtarzające się rekordy, dlatego nie wiem gdzie konkretnie tkwi błąd.

Odesłałeś mnie do innego sposobu, ale chyba możesz mi przerobić tą linijkę z tym distinctem na taką która by działała ;D
nospor
Cytat
No, ale nie wyjaśniłeś dlaczego ten distinct w podzapytaniu zwraca wszystkie href a nie pomija tych które są zdublowane.
Bo tak dziala distinct!!

ala
ala
ola

Zrobienie distinct po tym zroci ci:
ala
ola
czyli zwraca wszystkie imiona, pomijajac duplikaty

Teraz w glownym zapytaniu wykluczasz ala i ola czyli defacto wykluczasz wszystko!!

Sorki za wykrzykniki smile.gif
majestiq
No i właśnie o to mi chodziło, że ten distinct

ala
ola
ola

zwracał mi to samo i dlatego tak sie denerwowałem i marudziłem smile.gif
Teraz jak sprawdzam to już jest ok, więc nie wiem czy coś źle wpisałem czy jakiś dziwny cache czy co,
bo naprawdę nie usuwał mi zduplikowanych wierszy smile.gif

Więc SELECT DISTINCT href FROM `test_1` wkońcu ładnie usuwa mi duplikaty i mam same uniq, ale w taki razie jak teraz wybrać tylko te, których nie ma w tym zapytaniu ?

  1. <?php
  2. SELECT id, href FROM `test_1` WHERE href not in (SELECT DISTINCT href FROM `test_1`)
  3. ?>


Proszę tylko o przerobienie tego kodu i już kończe posta ;-)

PLZ
kaem
Zobacz, ten fragment zapytania
  1. <?php
  2. (SELECT DISTINCT href FROM `test_1`)]
  3. ?>

wybiera ci WSZYSTKIE! rekordy z test_1, ALE w ten sposób, że te co występują wielokrotnie w tabeli zwracane są tylko raz.
Jak już wybierze WSZYSTKIE te rekordy z tabeli test_1 to masz taki warunek, żeby
  1. <?php
  2. WHERE href not in
  3. ?>

czyli tak naprawdę żeby href nie był równy ŻADNEMU wcześniej wybranemu. Ty za pomocą ostatniego selecta wybrałeś wszystkie rekordy, z pominięciem tyko tych co się powtarzają. A więc to całe zapytanie słownie smile.gif wygląda tak: "wybierz kolumny id i href z tabeli test_1 gdzie href nie jest rowne zadnemu href z tej tabeli". Czyli zapytanie nic nie zwróci! Tak jak napisał nospor użyj gruop by, havung i count. Mała podpowiedź:
  1. <?php
  2. group by href having count(href) > 1
  3. ?>


PS: ale masz streszczenie tongue.gif
majestiq
Dzięki za łopatologiczne wyjaśnienie.
Wkońcu komuś udało się wytłumaczyć mi tą sprawę :-)

W takim razie ten distinct tak naprawdę zwraca wszystkie wyniki, tylko pomija zdublowane rekordy i ich nie wyświetla ale je zawiera
a tego nie wiedziałem.

  1. <?php
  2. SELECT DISTINCT id,href FROM test_1 group by href having count(href) > 1
  3. ?>


Już jest praktycznie ok, z tym że jak 'coś' powtarza mi się np 3 razy to ja dostaje tylko 1 wynik, a chciałbym dostać 2 (wszystkie poza 1, żebym widział, wszystkie wiersze, które są do wywalenia).
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.