SELECTING avec plusieurs conditions WHERE sur la même colonne
P粉384366923
P粉384366923 2023-08-23 19:08:16
0
2
438
<p>D'accord, je pense que j'oublie peut-être quelque chose d'évident/simple ici... mais je dois écrire une requête qui renvoie uniquement les enregistrements qui correspondent à plusieurs critères sur la même colonne... </ p> <p>Ma table est une configuration de lien très simple pour appliquer des indicateurs aux utilisateurs...</p> <pre class="brush:php;toolbar:false;">ID contactid flag flag_type ---------------------------------- 118 99 Bénévole 1 119 99 Téléchargé 2 120 100 via importation 3 121 100 Bénévole 1 122 100 Téléchargé 2</pre> <p>Attendez... Dans ce cas, vous verrez que les contacts 99 et 100 sont tous deux marqués comme « Bénévole » et « Téléchargé »...</p> <p>Tout ce que j'ai à faire est de renvoyer les identifiants de contact qui correspondent à plusieurs critères saisis via le formulaire de recherche... l'identifiant de contact doit correspondre à tous les indicateurs sélectionnés... Dans ma tête, le SQL devrait ressembler à : < /p> </p> <pre class="brush:php;toolbar:false;">SELECT identifiant de contact OÙ drapeau = 'Bénévole' AND flag = 'Téléchargé'...</pre> <p>Mais... rien n'est renvoyé... qu'est-ce que je fais de mal ici ? </p>
P粉384366923
P粉384366923

répondre à tous(2)
P粉511896716

Utilisation :

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

La clé est le nombre d'arguments dans la clause t.flag 的计数需要等于 IN.

Utilisez COUNT(DISTINCT t.flag) au cas où la combinaison de contactid et flag n'a pas de contrainte unique - s'il n'y a aucune chance de duplication, vous pouvez omettre le DISTINCT de la requête :

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

Vous pouvez utiliser GROUP BYHAVING 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

(en supposant que contact_id, flag est unique).

Ou utilisez le lien :

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'

Si la liste des drapeaux est longue et qu'il y a de nombreux matchs, le premier peut être plus rapide. Si la liste des drapeaux est courte et qu'il y a peu de correspondances, vous constaterez peut-être que le second est plus rapide. Si les performances posent problème, essayez de les tester sur vos données pour voir laquelle fonctionne le mieux.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal