2010-06-14 12 views
0

Voici le code que j'ai actuellement:Sélectionnez 2 lignes du tableau lorsque le nombre d'une autre table

SELECT `A`.* 
    FROM `A` 
LEFT JOIN `B` ON `A`.`A_id` = `B`.`value_1` 
    WHERE `B`.`value_2` IS NULL 
     AND `B`.`userid` IS NULL 
ORDER BY RAND() LIMIT 2 

Ce qu'il est actuellement censé faire est de sélectionner 2 lignes de A lorsque les 2 lignes A_id étant sélectionnées sont pas dans value_1 ou value_2 dans . Et les lignes dans B sont spécifiques aux utilisateurs individuels avec userid.

Ce que je dois faire est de le faire aussi pour que vérifie également s'il y a déjà N lignes B correspondant à un A_id (dans value_1, ou value_2) et userid, et s'il y a plus de N lignes, il doesn ne sélectionnez pas la ligne A.

Répondre

1

Voici manipulerait votre première demande:

Select ... 
From A 
    Left Join B 
     On (B.value_1 = A.A_id Or B.value_2 = A.A_id) 
      And B.userid = @userid 
Where B.<non-nullable column> Is Null 

Une partie de l'affaire se déplace vos critères dans la clause ON de la jointure gauche. Je ne sais pas comment la deuxième partie de votre demande correspond à la première partie. S'il n'y a pas de lignes dans B qui correspondent à valeur_1 ou valeur_2 pour l'utilisateur donné, alors par définition ce nombre de lignes sera zéro. Est-ce que vous voulez que ce soit la situation où il ne peut y avoir qu'un nombre maximum de lignes dans B correspondant aux critères donnés? Si oui, alors j'écrirais ma requête comme ceci:

Select ... 
From A 
Where (
     Select Count(*) 
     From B B2 
     Where (B2.value_1 = A.A_id Or B2.value_2 = A.A_id) 
      And B2.userid = @userid 
     ) <= @MaxItems 
+0

Merci Thomas! Cela fonctionne, pour la plupart. Sauf que je reçois parfois la même ligne retourne deux fois (il ne devrait jamais avoir la même ligne retourne deux fois), et parfois il retourne des lignes que le '' B2.value_1 = A.A_id ou B2.value_2 = A.A_id' " devrait l'empêcher de le faire. Habituellement, il semble qu'ils sont dans l'ordre différent quand ils le sont. – Marcus

+0

@Marcus - De quelle requête? La première requête ne doit jamais renvoyer plus d'une valeur PK pour A. Si vous pensez qu'elle renvoie plusieurs fois la même ligne (même ligne de quoi?), Pouvez-vous nous montrer un exemple d'entrée et la sortie qu'elle produit? – Thomas

+0

Oh, je vois ce que j'ai fait ... Je vous ai mal compris et combiné vos deux requêtes ... Oups. Je l'ai maintenant du travail. Merci encore! – Marcus