Je ne sais pas comment écrire le titre de cette question, donc le titre peut sembler vraiment déroutant, alors veuillez regarder ici. supposons que nous ayons ces deux tables.
La première table est id, nom, sexe. C'est l'identifiant de leur jeu comme la connexion où le nom et le sexe sont leur nom et leur sexe dans la vraie vie.
Où dans le deuxième tableau, le nom et le sexe se réfèrent au sexe du jeu et le nom se réfère également au nom du jeu.
select id, name, gender, (select count(*) from table_2 as t2 where t2.id = t1.id group by id) as #Character from table_1 as t1 order by login;
Nous voulons sélectionner l'identifiant, le nom et le sexe (dans le premier tableau), ainsi que le nombre de caractères qu'un identifiant avait mais qui n'a pas le même sexe que dans la vie réelle. Cela peut sembler vraiment déroutant, alors voici ce que devrait être la sortie
id | name | gender| #Character ---+-------+-------+----------- 2 B M 1 3 C M 3
id1: La raison pour laquelle il n'affiche pas id 1 est que id = 1 est F et qu'elle a créé 2 personnages dans le jeu, mais les deux personnages sont F donc elle n'a pas `` changé '' de sexe afin que nous n'imprimions pas le rangée.
id2: Nous sélectionnons id 2 parce que id = 2 est M dans la vie réelle, mais le personnage du jeu est F donc nous sélectionnons cette ligne.
id3: Il est M dans la vraie vie et l'un de ses personnages est F donc nous sélectionnons cette ligne
id4: Il est M et aucun de ses personnages n'est F donc nous n'avons pas besoin de l'imprimer à l'écran.
J'espère que vous comprenez ce que j'essaie de faire ici.
id | name | gender id | name | Gender ---+------+---- ----+-------------+-------- 1 | A | F 1 | a | F 2 | B | M and 1 | b | F 3 | C | M 2 | c | F 4 | D | M 3 | d | M 3 | e | M 3 | f | F 4 | g | M 4 | h | M
La requête ci-dessus affichera chaque identifiant, nom, sexe et nombre de caractères qu'un identifiant avait, mais ce n'est pas ce que je voulais. Que dois-je changer mon code pour qu'il fonctionne comme ce que j'avais l'intention de faire?
3 Réponses :
Maintenant que je comprends le problème:
select t1.*, count(*) from table_1 t1 join table_2 t2 on t2.login = t1.login group by t1.id having count(*) filter (where t2.gender <> t1.gender) > 0;
En d'autres termes, vous pouvez filtrer dans la clause having
.
Je pense que l' id
et la login
peuvent être confondus - votre exemple de requête ne correspond pas aux exemples de données. Mais vous devriez avoir l'idée.
merci pour le code. C'était un peu faux parce que je pense que vous vous faites une mauvaise idée de mon intention. #Characters affiche le nombre de caractères qu'un identifiant a, quel que soit le sexe. Cependant, je change un peu votre code et je le fais fonctionner alors merci.
Essaye ça:
select id, (select count(*) from table_2 as t2 where t2.id = t1.id group by id having count(*) >1) as #Character from table_1 as t1 order by login;
En fait, c'est simple.
Nous voulons sélectionner l'identifiant, le nom et le sexe (dans le premier tableau), et ... les caractères qu'un identifiant avait mais qui n'a pas le même sexe que la vraie vie.
select *, (select count(*) from t2 where t1.id = t2.id) as "#Character" from t1 where exists (select 1 from t2 where t1.id = t2.id and t1.gender <> t2.gender)
Nous voulons sélectionner l'identifiant, le nom et le sexe (dans le premier tableau), ainsi que le nombre de caractères ...
select * from t1 where exists (select 1 from t2 where t1.id = t2.id and t1.gender <> t2.gender)
la sortie souhaitée est erronée. Si je l'ai bien compris, l'utilisateur 3 devrait afficher 1 caractère au lieu de 3?
@Jorge Campos Le désir est correct. id 3 a 3 caractères-nom qui est d, e, f. Le sexe sert uniquement à décider de sortir ou non la ligne, mais id 3 contient toujours 3 caractères d, e, f.
Merci pour l'explication.