0
votes

SQL ne renvoie que des rangées qui ont certaines valeurs de colonne

 Entrez la description de l'image ici

avec mes tables ci-dessus comment puis-je renvoyer le user_id (S) qui appartiennent à des entreprises uniquement dans type_id = 34 et 35 et n'appartenant pas à type_id = 8. Donc, depuis comp_id = 3 ISNT in type_id = 8 et est dans type_id = 34 et 35 donc Les résultats doivent être user_id = 104 et 105

Je cherche des utilisateurs qui sont dans des entreprises type_id = 34 et 35 non ni. Si ce n'est pas en 34 mais en 35, les utilisateurs de cette entreprise ne doivent pas être retournés.


8 commentaires

La réponse que vous avez acceptée reviendra également user_ids qui ne sont que type_id = 34 ou uniquement type_id = 35. Dans votre question, vous avez mentionné deux fois 34 et 35.


@forpas: Vous avez peut-être raison, je pense que la question n'est pas entièrement claire là-bas. Depuis que l'OP dit 'entreprises uniquement dans type_id = 34 et 35, j'ai compris qu'il voulait dire l'un des deux, mais pas nécessairement tous les deux.


et signifie les deux, ou signifie l'un des deux.


et dans peut signifier non plus. Ce serait formidable si l'Op a éliminé cela. Je ne dis pas que tu as tort, je dis simplement que ça me confondait.


Maintenant que vous avez clarifié, pourquoi avez-vous accepté une réponse qui ne répond pas à votre exigence?


@forpas La 2e requête répond à mes critères. Ne veut pas les entreprises qui sont en 8


Non, cela ne répond pas à vos critères. Il retournera user_ids qui n'ont que type_id = 34 ou uniquement type_id = 35 car ils ne sont pas tous les deux pas 8.


@ forpas ah tu es à droite.


3 Réponses :


2
votes

Vous pouvez utiliser l'agrégation conditionnelle pour obtenir le comp_id code> S répondant à vos conditions et avec l'opérateur dans code> obtenez le user_id code> S:

select user_id 
from Table_2
where comp_id in (
  select comp_id
  from Table_1
  group by comp_id
  having sum(type_id = 8) = 0
     and sum(type_id in (34, 35)) = 2
)


0 commentaires

0
votes

Ceci est un moyen simple et lisible de le faire.

SELECT DISTINCT Table_2.user_id 
FROM Table_2
INNER JOIN
     (SELECT DISTINCT comp_id
      FROM Table_1
      WHERE type_id IN (34, 35)
     ) type_include ON Table_2.type_id = type_include.type_id
LEFT JOIN
     (SELECT DISTINCT comp_id
      FROM Table_1
      WHERE type_id IN (8)
     ) type_exclude ON Table_2.type_id = type_exclude.type_id
                   AND type_exclude.type_id IS NULL


1 commentaires

MySQL ne supporte pas moins.



0
votes

Vous pouvez faire une telle chose avec une sous-requête, dans laquelle vous spécifiez la condition qui ne doit pas être remplie xxx pré>

ps: pour les données de votre exemple, vous ne seriez même pas à Vérifiez que l'ID soit égal à 35 ou 34 car il n'y a aucune autre valeur dans vos données de toute façon. P>

SELECT DISTINCT t2.user_id 
    FROM Table_2 t2 
    WHERE t2.comp_id NOT IN (SELECT comp_id FROM Table_1 WHERE type_id = 8)
;


1 commentaires

J'utilise la 2e solution. Je cherche 34 "et" 35 non ni 34 ou 35. Oui, il existe d'autres types_ids autres que 8, 34 et 35. Il est correct si le corp_id est dans ces types. Je ne les veux tout simplement pas dans Type_id 8 du tout.