0
votes

Comment puis-je générer une table dans laquelle un identifiant a un sexe différent dans son jeu

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 commentaires

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.


3 Réponses :


0
votes

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.


1 commentaires

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.



0
votes

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;


0 commentaires

0
votes

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)


0 commentaires