2017-10-08 14 views
3

Cela devrait être très simple, mais je suis coincé dessus et je n'ai pas trouvé la réponse ici.MYSQL sélectionnez le compte (*) dans une table si l'ID existe dans une autre table

Je veux compter le nombre d'enregistrements dans une table qui correspondent à un user_id donné si ce user_id existe dans une autre table, ou si elle ne renvoie pas -1.

Quelque chose comme:

SELECT COUNT(*) 
FROM table_1 
WHERE user_id = (IF EXISTS table_2.user_id = '22') 
, ELSE -1; 

En résumé, si table_2 contient une user_id de 22, puis retourne le nombre d'enregistrements dans table_1 avec un user_id de 22 ans, ou sinon, le retour -1.

Comment est-ce que je fais ceci? (. NB Pour préciser, user_id n'est pas une clé primaire dans les deux tables)

EDIT: ajouter l'échantillon de table:

table_1 
--------------------- 
user_id | item 
--------------------- 
22  | apple 
23  | orange 
22  | banana 

table_2 
--------------------- 
user_id | name 
--------------------- 
20  | billy 
21  | bob 
22  | thornton 

donc d'exécuter la requête que j'ai besoin avec user_id = 21 renverrait 0, en cours d'exécution avec user_id = 22 renverrait 2 et avec user_id = 23 renverrait -1.

+0

Pouvez-vous fournir des exemples de données et les résultats souhaités? Votre demande n'a aucun sens pour moi. Vous avez une comparaison dans 'where' et vous dites que quelque chose renvoie' -1'. –

Répondre

1

Une astuce intéressante (sale?) Que vous pouvez utiliser est de sélectionner les nombres des deux tables et de joindre les résultats. Puisque vous vous interrogez des fonctions d'agrégation sans clauses group by, vous êtes assuré d'obtenir une ligne dans chaque résultat:

SELECT  CASE cnt_2 WHEN 0 THEN -1 ELSE cnt_1 END 
FROM  (SELECT COUNT(*) AS cnt_1 
      FROM table_1 
      WHERE user_id = 22) t 
CROSS JOIN (SELECT COUNT(*) AS cnt_2 
      FROM table_2 
      WHERE user_id = 22) s 
+0

JOIN est une pénalité. –

+0

Cela semble un peu trop compliqué et peut-être coûteux de faire deux comptes et une jointure? Je n'ai pas besoin de compter le nombre de correspondances dans table_2, juste besoin de savoir s'il y a au moins une correspondance. – freeworlder

+0

MySql renvoie l'erreur: # 1248 - Chaque table dérivée doit avoir son propre alias – freeworlder

1

Est-ce que cela vous donne le résultat que vous avez besoin?

SELECT 
CASE COUNT(*) WHEN 0 THEN -1 ELSE COUNT(*) END AS row_count 
FROM table_1 
WHERE user_id = 22 
AND (
    SELECT COUNT(*) 
    FROM table_2 
    WHERE user_id = 22) >= 1; 

Il utilise une instruction CASE pour implémenter la vérification et affiche -1 si aucun enregistrement n'est trouvé. Il utilise une sous-requête dans la clause WHERE pour trouver le nombre d'enregistrements dans la table_2, et vérifie qu'il est supérieur ou égal à 1.

Il y a plusieurs façons de le faire - cela peut être fait avec un LEFT JOIN ou un EXISTS, mais je pense que cela fonctionnera.

+0

Je n'arrivais pas à faire marcher ça. Beaucoup d'erreurs de syntaxe. Mot-clé attendu. (près de "COUNT" à la position 12) Fin inattendue de l'expression CASE (près de "" à la position 11) Mot-clé non reconnu. (près de "COUNT" à la position 12) Jeton inattendu. (near "(" à la position 17) Jeton inattendu (près de "*" à la position 18) Jeton inattendu (près de ")" à la position 19) Mot-clé non reconnu. (près de "WHEN" à la position 21) Jeton inattendu. (près de "0" à la position 26) Mot-clé non reconnu. (près de "THEN" à la position 28) Jeton inattendu.(près de "-1" à la position 33) ... ?? – freeworlder

+0

Je ne suis pas sûr pourquoi ces erreurs de syntaxe apparaissent, en utilisant SELECT COUNT (*) et CASE est une syntaxe valide. Je vais le vérifier par rapport à une base de données MySQL quand j'en aurai l'occasion. – bbrumm

+0

J'ai vérifié la syntaxe et ça a l'air bien. Avez-vous des devis supplémentaires ou avez-vous apporté des changements à cela? – bbrumm