2010-11-26 5 views
0

J'ai un de ces moments où quelque chose me semble si simple mais je n'arrive pas à trouver la bonne requête. Je suis à la recherche d'une requête qui vérifie si une certaine relation many-to-many existe déjà. Considérez le tableau suivant:Requête pour vérifier si une relation many-to-many existe

 
    +---------+---------+ 
    | feed_id | coll_id | 
    +---------+---------+ 
    |  1 |  1 | 
    |  1 |  2 | 
    |  1 |  3 | 
    +---------+---------+ 

Il est une table d'un plusieurs à plusieurs entre une table « flux » et une table « collections ».

J'ai besoin d'une requête qui vérifie si un flux existe déjà qui a des collections 1 et 2, et seulement 1 et 2. S'il y a, j'aurais besoin de son feed_id.

Dans le tableau ci-dessus, ce flux n'existe pas.

Une description plus générique de la requête serait: trouver un flux qui contient tous les identificateurs coll_id, et que le flux ne contienne aucune autre collection. Cela signifie ce qui suit pour l'exemple ci-dessus:

  1. en vous assurant que coll_id est IN (1,2)
  2. en vous assurant que COUNT (*) OU FEED_ID = 1 retournerait 2 (le nombre de années coll_id

Ce qui pose problème à l'étape 2 est que je n'ai pas la valeur du feed_id disponible dans ma sous-requête.

Ou suis-je complètement sur la mauvaise piste?

Toute aide serait grandement appréciée!

Répondre

1

Je pense que cela répondra à toutes les situations:

SELECT coll_id, feed_id 
FROM a a1 
GROUP BY coll_id 
HAVING feed_id IN (2,4) 
AND COUNT(*) = 2 
AND NOT EXISTS (
    SELECT * 
    FROM a a2 
    WHERE a2.coll_id = a1.coll_id 
    AND feed_id NOT IN (2,4) 
) 

J'ai fait mon des tests avec ces données:

+---------+---------+ 
| feed_id | coll_id | 
+---------+---------+ 
|  1 |  1 | 
|  2 |  4 | 
|  2 |  7 | 
|  3 |  3 | 
|  4 |  2 | 
|  4 |  4 | 
|  5 |  4 | 
|  6 |  1 | 
|  6 |  2 | 
|  6 |  4 | 
|  7 |  2 | 
|  7 |  4 | 
+---------+---------+ 

seulement coll_id 4 et 7 a seulement 2 et 4 comme FEED_ID

J'ai aussi le test avec FEED_ID (1,2,4) retourne 6 et FEED_ID (3) retourne 3

Patrick

+0

Merci Patrick, cette requête fonctionne merveilleusement bien! – wkjagt

0

Je n'ai pas testé cette requête, et je suppose que vous avez une clé unique sur les deux colonnes:

SELECT feed_id 
FROM t 
WHERE feed_id = 1 AND coll_id IN (1,2) 
GROUP BY feed_id 
HAVING COUNT(coll_id) = 2 
+0

Le problème est que je ne connais pas le FEED_ID. Je interroge cette table avec IN (1,2) et il devrait me renvoyer 0 lignes, parce que je cherche un flux avec 'exactement' coll_id 1 et 2. Feed_id 1 ne devrait pas être retourné, parce qu'il a aussi coll_id = 3. Si je fais la même requête avec IN (1,2,3), alors il devrait retourner feed_id 1. – wkjagt

+0

Attendez, avez-vous besoin de la liste de _all_ le 'feed_id's qui ont seulement coll 1 et 2? – cambraca

+0

Je viens de faire un test rapide. Cela fonctionne si vous faites 'IN (1,2,3)' et ensuite 'HAVING COUNT (coll_id) = 3' (ce nombre devrait être le nombre d'éléments que vous avez dans' IN'). Si vous ne voulez pas limiter à un seul 'feed_id', vous pouvez juste enlever 'feed_id = 1 AND' de la requête, et il retournera une liste de' feed_id's qui correspondent aux critères. – cambraca

Questions connexes