2010-11-07 7 views
0

D'après ce que je lis, c'est le genre de chose qui doit être fait avec un opérateur de division, mais apparemment cela n'est pas implémenté dans MySQL . Fondamentalement, mon installation est une table avec deux colonnes où les clés sont listées plusieurs fois avec des listes différentes dans la deuxième colonne, par exemple.MySQL: Sélection de clés étrangères avec des champs correspondant à tous les mêmes champs d'une autre table

PID | GID 
A1 | G1 
A1 | G2 
A2 | G1 
A2 | G3 
A3 | G1 
A3 | G2 
A4 | G2 
A4 | G3 

Fondamentalement, je dois trouver un sous-ensemble de la table en fonction de PID et tous les GID qui y sont associés, par exemple tous GID que A3 est affecté, ce qui est assez facile à obtenir, la production d'une table intermédiaire

PID | GID 
A3 | G1 
A3 | G2 

Mais ce qui me donne du mal est de trouver comment sélectionner les enregistrements dans la table d'origine qui correspondent à tous les GID pour la table de sous-ensemble. Comme je l'ai dit, tout ce que j'ai pu trouver pointe vers un opérateur de division, mais cela n'existe pas dans MySQL, donc je suis au bout du compte. Je ne peux pas trouver un moyen de rejoindre ou faire une opération qui correspond à tous les GID - seulement des correspondances partielles, ce qui n'est pas ce que je cherche. De l'aide? Le livre que je regarde n'est pas particulièrement utile.

Répondre

0

Donc, vous avez une liste de GID et vous voulez tous les PID qui ont tous les GID dans la liste?

Étant donné que (par exemple dans votre langue de procédure), vous pouvez déterminer combien GID vous avez, d'une manière assez étrange mais réalisable est la suivante:

SELECT FROM the_table WHERE GID IN ('G1','G2') GROUP BY PID HAVING COUNT(*) = 2 
+0

Si PID et GID n'étaient pas directement liés, vous deviez utiliser COUNT (DISTINCT GID). – AndreKR

+0

Cela fonctionne vraiment bien - c'est quelque chose que j'essayais, mais j'avais une mauvaise syntaxe; Je suppose que c'est parce que j'essayais de compter des GID distincts, ce qui a causé des problèmes. Merci! – Stuart

0

Je ne suis pas 100% sûr que ce soit ce que vous êtes après depuis votre question est un peu déroutant, mais nous allons voir ...

Vous semblez être après une sous-requête:

SELECT pid, gid FROM your_table WHERE gid in (SELECT gid FROM your_table WHERE pid = 'A3') 

Cela va sélectionner toutes les lignes de votre table où le GID correspond à l'un des GID qui sont associés au PID 'A3'. Vous pourriez avoir besoin de relire ça lentement ... c'est une bouchée.

+0

Eh bien, le problème qui est qu'il retourne Les PID qui n'ont pas tous les GID de la sous-requête. Fondamentalement, je dois faire en sorte que seuls les PID soient retournés s'ils ont TOUS les mêmes GID que A3, et les rejeter s'ils sont partiels. Donc, dans le cas de l'exemple de table que j'ai donné, seulement A1 devrait être retourné, puisque c'est le seul avec G1 et G2 comme GID, même que A3. Désolé si c'est un peu déroutant; J'ai eu du mal à trouver de l'aide pour la plupart parce que je ne sais pas exactement comment l'exprimer. – Stuart

+0

Ok je me suis fait. Il pourrait y avoir une certaine façon ésotérique de le faire en MySQL (peut-être conditionnel), mais cela pourrait être mieux géré dans votre couche d'application. Voyons voir si quelqu'un plus sage partage un meilleur moyen. – coreyward

Questions connexes