Wybór z wieloma warunkami gdzie w tej samej kolumnie

Ok, myślę, że mogę przeoczyć coś oczywistego / prostego tutaj... ale muszę napisać zapytanie, które zwraca tylko rekordy, które pasują do wielu kryteriów w tej samej kolumnie...

Moja tabela jest bardzo prostą konfiguracją linkowania do stosowania FLAG do użytkownika ...

ID   contactid  flag        flag_type 
-----------------------------------
118  99         Volunteer   1 
119  99         Uploaded    2 
120  100        Via Import  3 
121  100        Volunteer   1  
122  100        Uploaded    2

Itd... w tym przypadku zobaczysz, że zarówno kontakt 99, jak i 100 są oznaczone jako "wolontariusz " i"przesłane"...

Co muszę być w stanie zrobić, to zwrócić te kontakty tylko, że pasują do wielu kryteriów wprowadzonych poprzez formularz wyszukiwania...kontakt musi pasować do wszystkich wybranych FLAG... w mojej głowie SQL powinien wyglądać tak:

SELECT contactid 
 WHERE flag = 'Volunteer' 
   AND flag = 'Uploaded'...
Ale... to nic nie zwraca... Co ja tu robię źle?
Author: dreftymac, 2010-10-29

11 answers

Możesz użyć GROUP BY i HAVING COUNT(*) = _:

SELECT contact_id
FROM your_table
WHERE flag IN ('Volunteer', 'Uploaded', ...)
GROUP BY contact_id
HAVING COUNT(*) = 2 -- // must match number in the WHERE flag IN (...) list

(zakładając, że contact_id, flag jest unikalne).

Lub użyj łączników:

SELECT T1.contact_id
FROM your_table T1
JOIN your_table T2 ON T1.contact_id = T2.contact_id AND T2.flag = 'Uploaded'
-- // more joins if necessary
WHERE T1.flag = 'Volunteer'

Jeśli lista FLAG jest bardzo długa i jest wiele dopasowań, pierwsza jest prawdopodobnie szybsza. Jeśli lista FLAG jest krótka i jest kilka dopasowań, prawdopodobnie zauważysz, że druga jest szybsza. Jeśli wydajność jest problemem, spróbuj przetestować oba na swoich danych, aby zobaczyć, które działa najlepiej.

 69
Author: Mark Byers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-28 22:10:03

Użycie:

  SELECT t.contactid
    FROM YOUR_TABLE t
   WHERE flag IN ('Volunteer', 'Uploaded')
GROUP BY t.contactid
  HAVING COUNT(DISTINCT t.flag) = 2

Najważniejsze jest to, że zliczanie t.flag musi być równe liczbie argumentów w IN klauzuli.

Użycie COUNT(DISTINCT t.flag) jest w przypadku, gdy nie ma unikalnego ograniczenia na kombinację contactid i flag -- jeśli nie ma szans na duplikaty, możesz pominąć distinctive z zapytania:

  SELECT t.contactid
    FROM YOUR_TABLE t
   WHERE flag IN ('Volunteer', 'Uploaded')
GROUP BY t.contactid
  HAVING COUNT(t.flag) = 2
 14
Author: OMG Ponies,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-28 22:03:31

Rozważ użycie INTERSEKTU w ten sposób:

SELECT contactid WHERE flag = 'Volunteer' 
INTERSECT
SELECT contactid WHERE flag = 'Uploaded'
Myślę, że to najbardziej logistyczne rozwiązanie.
 8
Author: wtct,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-29 09:21:33

Naprawdę nie widzę Twojej tabeli, ale flaga nie może być zarówno "ochotnik", jak i "przesłany". Jeśli masz wiele wartości w kolumnie, możesz użyć

WHERE flag LIKE "%Volunteer%" AND flag LIKE "%UPLOADED%"

Nie dotyczy wyświetlania sformatowanej tabeli.

 4
Author: Orbit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-28 22:02:01

Spróbuj użyć tego alternatywnego zapytania:

SELECT A.CONTACTID 
FROM (SELECT CONTACTID FROM TESTTBL WHERE FLAG = 'VOLUNTEER')A , 
(SELECT CONTACTID FROM TESTTBL WHERE FLAG = 'UPLOADED') B WHERE A.CONTACTID = B.CONTACTID;
 2
Author: Pankaj Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-03 17:21:23

Zmień i na OR. Zwykły błąd. Pomyśl o tym jak o prostym angielskim, chcę wybrać cokolwiek z tym równa się to lub tamto.

 -1
Author: user981298,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-23 23:23:02
SELECT contactid, Count(*) 
FROM <YOUR_TABLE> WHERE flag in ('Volunteer','Uploaded')  
GROUP BY contactid 
HAVING count(*)>1;
 -1
Author: vivek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-10 12:15:43

AND zwróci ci odpowiedź tylko wtedy, gdy zarówno volunteer, jak i uploaded są obecne w Twojej kolumnie. W przeciwnym razie zwróci null wartość...

Spróbuj użyć OR w swoim oświadczeniu ...

SELECT contactid  WHERE flag = 'Volunteer' OR flag = 'Uploaded'
 -2
Author: talha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-10 12:10:26

Czasami nie widać drewna dla drzew :)

Twój oryginalny SQL ..

SELECT contactid 
 WHERE flag = 'Volunteer' 
   AND flag = 'Uploaded'...

Powinno być:

SELECT contactid 
 WHERE flag = 'Volunteer' 
   OR flag = 'Uploaded'...
 -3
Author: Kevin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-27 11:27:25
select purpose.pname,company.cname
from purpose
Inner Join company
on purpose.id=company.id
where pname='Fever' and cname='ABC' in (
  select mname
  from medication
  where mname like 'A%'
  order by mname
); 
 -3
Author: user6310881,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-09 14:40:07

Twój kod:

SELECT contactid 
WHERE flag = 'Volunteer' AND flag = 'Uploaded' [...]

Nie zadziała, ponieważ nie zadeklarowałeś nazwy tabeli. wykonanie zwróci komunikat o błędzie.

I jeśli chcesz, aby oba zapytania były wyświetlane, Twój kod powinien wyglądać mniej więcej tak.

SELECT * FROM (your_table_name) WHERE flag = 'Volunteer' OR flag = 'Uploaded';

I nie w ten sposób, ponieważ zawsze zwróci false SELECT * FROM (your_table_name) WHERE flag = 'Volunteer' AND flag = 'Uploaded';

Możesz również to zrobić

SELECT * FROM (your_table_name) 
WHERE flag = 'Volunteer' OR flag = 'Uploaded' 
ORDER BY contactid, flag asc; 

(asc dla porządku rosnącego, można również zmienić go na desc jeśli chcesz, aby wyświetlał się w porządku malejącym)

 -4
Author: Louie Aguilar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-09 05:38:58