Maison  >  Questions et réponses  >  le corps du texte

SELECTING avec plusieurs conditions WHERE sur la même colonne

<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粉384366923P粉384366923423 Il y a quelques jours387

répondre à tous(2)je répondrai

  • P粉511896716

    P粉5118967162023-08-24 17:05:54

    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

    répondre
    0
  • P粉138871485

    P粉1388714852023-08-24 11:10:07

    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.

    répondre
    0
  • Annulerrépondre