Ok, ich denke, ich übersehen hier möglicherweise etwas Offensichtliches / Einfaches ... aber ich muss eine Abfrage schreiben, die nur Datensätze zurückgibt, die mehreren Kriterien in derselben Spalte entsprechen ...
Meine Tabelle ist ein sehr einfaches Verknüpfungssetup zum Anwenden von Flags auf einen Benutzer ...
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
etc ... in diesem Fall sehen Sie, dass sowohl Kontakt 99 als auch 100 als "Freiwilliger" und "Hochgeladen" gekennzeichnet sind ...
Was ich tun muss, ist, NUR die Kontakt-IDs zurückzugeben, die mehreren Kriterien entsprechen, die über ein Suchformular eingegeben wurden. Die Kontakt-IDs müssen mit ALLEN ausgewählten Flags übereinstimmen. In meinem Kopf sollte die SQL ungefähr so aussehen:
SELECT contactid
WHERE flag = 'Volunteer'
AND flag = 'Uploaded'...
aber ... das bringt nichts zurück ... Was mache ich hier falsch?
quelle
Antworten:
Sie können entweder verwenden
GROUP BY
undHAVING 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
(vorausgesetzt, es
contact_id, flag
ist einzigartig).Oder verwenden Sie Joins:
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'
Wenn die Liste der Flags sehr lang ist und es viele Übereinstimmungen gibt, ist die erste wahrscheinlich schneller. Wenn die Liste der Flags kurz ist und es nur wenige Übereinstimmungen gibt, werden Sie wahrscheinlich feststellen, dass die zweite schneller ist. Wenn die Leistung ein Problem darstellt, testen Sie beide Daten, um festzustellen, welche am besten funktioniert.
quelle
GROUP BY
mitHAVING COUNT
sinnvoller ist.Verwenden:
SELECT t.contactid FROM YOUR_TABLE t WHERE flag IN ('Volunteer', 'Uploaded') GROUP BY t.contactid HAVING COUNT(DISTINCT t.flag) = 2
Der Schlüssel ist, dass die Zählung
t.flag
der Anzahl der Argumente in derIN
Klausel entsprechen muss.Die Verwendung von
COUNT(DISTINCT t.flag)
ist für den Fall, dass die Kombination von Kontakt-ID und Flag nicht eindeutig eingeschränkt ist. Wenn keine Duplikate möglich sind, können Sie das DISTINCT in der Abfrage weglassen:SELECT t.contactid FROM YOUR_TABLE t WHERE flag IN ('Volunteer', 'Uploaded') GROUP BY t.contactid HAVING COUNT(t.flag) = 2
quelle
Verwenden Sie INTERSECT wie folgt:
SELECT contactid WHERE flag = 'Volunteer' INTERSECT SELECT contactid WHERE flag = 'Uploaded'
Ich denke, es ist die logistischste Lösung.
quelle
Ich kann Ihren Tisch nicht wirklich sehen, aber die Flagge kann nicht gleichzeitig "Freiwillig" und "Hochgeladen" sein. Wenn eine Spalte mehrere Werte enthält, können Sie diese verwenden
Nicht wirklich zutreffend, wenn man die formatierte Tabelle sieht.
quelle
Versuchen Sie, diese alternative Abfrage zu verwenden:
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;
quelle
SELECT contactid, Count(*) FROM <YOUR_TABLE> WHERE flag in ('Volunteer','Uploaded') GROUP BY contactid HAVING count(*)>1;
quelle
Ändern Sie AND in OR. Einfacher Fehler. Betrachten Sie es als einfaches Englisch, ich möchte alles auswählen, was diesem oder jenem entspricht.
quelle
AND
Sie erhalten nur dann eine Antwort, wenn beidevolunteer
unduploaded
in Ihrer Spalte vorhanden sind. Andernfalls wird dernull
Wert zurückgegeben ...versuchen Sie es
OR
in Ihrer Aussage ...SELECT contactid WHERE flag = 'Volunteer' OR flag = 'Uploaded'
quelle
Volunteer
ODER sind,Uploaded
aber er möchte Einträge, die zweimal in sind und jeweils einmal habenselect 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 );
quelle
dein Code :
SELECT contactid WHERE flag = 'Volunteer' AND flag = 'Uploaded' [...]
wird nicht funktionieren, da Sie den Tabellennamen nicht deklariert haben. Die Ausführung gibt eine Fehlermeldung zurück.
und wenn beide Suchabfragen angezeigt werden sollen, sollte Ihr Code ungefähr so aussehen.
SELECT * FROM (your_table_name) WHERE flag = 'Volunteer' OR flag = 'Uploaded';
und nicht so, weil es immer false zurückgibt. SELECT * FROM (your_table_name) WHERE flag = 'Volunteer' AND flag = 'Uploaded';
Sie können dies auch tun
SELECT * FROM (your_table_name) WHERE flag = 'Volunteer' OR flag = 'Uploaded' ORDER BY contactid, flag asc;
(Aufsteigend für aufsteigende Reihenfolge, Sie können es auch in absteigend ändern, wenn es in absteigender Reihenfolge angezeigt werden soll.)
quelle
Verwenden Sie dies: Zum Beispiel:
select * from ACCOUNTS_DETAILS where ACCOUNT_ID=1001 union select * from ACCOUNTS_DETAILS where ACCOUNT_ID=1002
quelle
Manchmal kann man den Wald vor lauter Bäumen nicht sehen :)
Ihre ursprüngliche SQL ..
SELECT contactid WHERE flag = 'Volunteer' AND flag = 'Uploaded'...
Sollte sein:
SELECT contactid WHERE flag = 'Volunteer' OR flag = 'Uploaded'...
quelle