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? 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.
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
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.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.
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;
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.
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;
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'
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'...
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
);
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)
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