SELECTING mit mehreren WHERE-Bedingungen in derselben Spalte

Ok, ich denke, ich könnte hier etwas Offensichtliches / Einfaches übersehen … aber ich muss eine Abfrage schreiben, die nur Datensätze zurückgibt, die mehreren Kriterien in derselben Spalte entsprechen …

Meine Tabelle ist eine sehr einfache Verknüpfungskonfiguration 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 beide Kontakte 99 und 100 als “Freiwillig” und “Hochgeladen” gekennzeichnet sind …

Was ich in der Lage sein muss, ist, dass NUR die Names von contactid zurückgegeben werden, die mehreren über ein Suchformular eingegebenen Kriterien entsprechen … die contactids müssen ALLE ausgewählten Flags entsprechen … in meinem Kopf sollte das SQL ungefähr so ​​aussehen:

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

aber … das bringt nichts zurück … Was mache ich hier falsch?

    Sie können entweder GROUP BY und 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 

    (angenommen contact_id, flag ist eindeutig).

    Oder verwende 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 Flaggen sehr lang ist und es viele Übereinstimmungen gibt, ist die erste wahrscheinlich schneller. Wenn die Liste der Flags kurz ist und es wenige Übereinstimmungen gibt, werden Sie wahrscheinlich feststellen, dass die zweite schneller ist. Wenn die performance ein Problem darstellt, testen Sie beide auf Ihre Daten, um zu sehen, welche am besten funktioniert.

    Benutzen:

      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 das Zählen von t.flag der Anzahl der Argumente in der IN Klausel entsprechen muss.

    Die Verwendung von COUNT(DISTINCT t.flag) ist für den Fall, dass es keine eindeutige Einschränkung für die Kombination von contactid und Flag gibt – wenn es keine Möglichkeit für Duplikate gibt, können Sie das DISTINCT aus der Abfrage weglassen:

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

    Erwägen Sie, INTERSECT wie folgt zu verwenden:

     SELECT contactid WHERE flag = 'Volunteer' INTERSECT SELECT contactid WHERE flag = 'Uploaded' 

    Ich denke es ist die logistischste Lösung.

    Ich kann deinen Tisch nicht wirklich sehen, aber die Flagge kann nicht sowohl “Freiwillig” als auch “Hochgeladen” sein. Wenn Sie mehrere Werte in einer Spalte haben, können Sie verwenden

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

    nicht wirklich anwendbar beim Betrachten der formatierten Tabelle.

    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; 

    Ändern Sie UND in ODER. Ein einfacher Fehler. Stellen Sie es sich wie einfaches Englisch vor, ich möchte alles auswählen, was diesem oder jenem entspricht.

     SELECT contactid, Count(*) FROM  WHERE flag in ('Volunteer','Uploaded') GROUP BY contactid HAVING count(*)>1; 

    AND gibt Ihnen nur dann eine Antwort, wenn sowohl volunteer als auch uploaded in Ihrer Spalte vorhanden sind. Andernfalls wird null zurückgegeben …

    Probieren Sie OR in Ihrer Aussage …

     SELECT contactid WHERE flag = 'Volunteer' OR flag = 'Uploaded' 

    Manchmal kann man den Wald nicht für die Bäume sehen 🙂

    Dein ursprüngliches SQL ..

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

    Sollte sein:

     SELECT contactid WHERE flag = 'Volunteer' OR flag = 'Uploaded'... 
     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 ); 

    dein Code :

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

    wird nicht funktionieren, denn Sie haben den Tabellennamen nicht deklariert. Die Ausführung wird eine Fehlermeldung zurückgeben.

    Wenn Sie möchten, dass beide Suchanfragen angezeigt werden, 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 (ihr_tabellenname) WHERE flag = ‘Volunteer’ UND flag = ‘Uploaded’;

    Sie können dies auch tun

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

    (asc für aufsteigende Reihenfolge, Sie können es auch in desc ändern, wenn es in absteigender Reihenfolge angezeigt werden soll)