Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Select DISTINCT, Czemu nie działa !?
majestiq
post
Post #1





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 26.10.2006

Ostrzeżenie: (0%)
-----


  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 (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) ?

Ten post edytował Ociu 8.08.2008, 05:49:13
Powód edycji: dodałem bbCode (ociu)
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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
Go to the top of the page
+Quote Post
majestiq
post
Post #3





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 26.10.2006

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

zreszta masz linka:
Temat: Wybranie powtarzajacych sie danych w kolumnie
Go to the top of the page
+Quote Post
majestiq
post
Post #5





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 26.10.2006

Ostrzeżenie: (0%)
-----


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` (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)

Proszę, zmodyfkuj ten kod tak jak Ty byś to zrobił, żeby osiągnąć efekt o który mi chodzi.
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.... (IMG:http://forum.php.pl/style_emoticons/default/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
Go to the top of the page
+Quote Post
majestiq
post
Post #7





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 26.10.2006

Ostrzeżenie: (0%)
-----


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.... (IMG:http://forum.php.pl/style_emoticons/default/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
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
majestiq
post
Post #9





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 26.10.2006

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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
Go to the top of the page
+Quote Post
kaem
post
Post #10





Grupa: Zarejestrowani
Postów: 248
Pomógł: 38
Dołączył: 29.06.2008

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

Ten post edytował kaem 12.08.2008, 17:50:50
Go to the top of the page
+Quote Post
majestiq
post
Post #11





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 26.10.2006

Ostrzeżenie: (0%)
-----


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).
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 13:29