0
votes

Vérifiez si plusieurs enregistrements existent, avec le même identifiant

J'essaie de vérifier si plusieurs enregistrements existent avec pageID dans (?,?,?) dans le Chatparticipants Table.

Ceci est un exemple de la Structure de la table: Entrez la description de l'image ici

C'est la requête SQL que j'ai essayée: xxx

Comportement attendu: < / fort>

  • Si une conversation existe déjà, avec les participants donnés (x), c'est-à-dire avec la même valeur chatide , il doit renvoyer la valeur chatide .

    Le SQL ci-dessus fonctionne, avec deux entrées. Cependant, la requête ci-dessous renvoie toujours le chatide , lequel ne devrait pas. (Comme il a le "144" qui n'est pas un participant) xxx

    des idées Pourquoi cela fait-il? Je veux seulement obtenir une sortie, si tous les participants correspondent à la requête et ont le même chattid.

    edit 2:

    entrez Description de l'image ici

    Ce SQL retournera deux identifiants de discussion. xxx

    sortie: xxx < / Pré>

    En fait, la sortie attendue ne doit renvoyer que l'ID de chat pour 43BCD7340F1ABF7eda09FCCCFFDBFE60

    Toutes idées?


4 commentaires

Je ne sais pas pourquoi la somme somme () est utilisée sur une colonne contenant des données non numériques


@Riggsfolly: ce somme s les conditions booléennes - dans MySQL c'est OK.


@Gmb apprendre quelque chose sur tous les bons jours :)


Quelle est votre version de mysql?


3 Réponses :


1
votes

Vous pouvez utiliser la clause où code> pour filtrer dans la liste des pages qui vous intéressent, puis vous assurez qu'ils ont été tous trouvés avec un ayant code> clause:

SELECT chatId 
FROM chatParticipants 
WHERE pageId IN ('deb47fba9bc6936ed76e831578baa480','123', '144')
GROUP BY chatId
HAVING COUNT(*) = 3


2 commentaires

. . Hé, cette requête semble avoir plusieurs chadides, quand, disons que la page (A, B) est dans une conversation à part entière, et (A, B, C) est dans une autre. J'ai mis à jour l'image de la table, une idée de la façon de travailler autour de cela? Merci..


Également essayé d'utiliser le nombre (page distincte) comme vous l'avez suggéré, mais toujours renvoyé la même sortie.



1
votes

Cela pourrait résoudre votre problème?

SELECT chatId FROM chatParticipants WHERE chatId IN (
  SELECT chatId FROM chatParticipants WHERE pageId
  IN ('123','deb47fba9bc6936ed76e831578baa480') GROUP BY chatId HAVING COUNT(*) = 2
) GROUP BY chatId HAVING COUNT(*) = 2


3 commentaires

Salut Daniele. La raison, c'est que j'aimerais vérifier si une conversation existe exactement entre les participants x, avec le même chattid, pour rediriger cette conversation, au lieu de créer une nouvelle. Si l'utilisateur souhaitait commencer une conversation avec B (uniquement), il ne faut pas rediriger vers la discussion dans laquelle l'utilisateur A, B, C est dans. J'espère que cela a du sens.


Crystal Clear @anders. Pourriez-vous s'il vous plaît vérifier ma réponse modifiée?


Je viens de l'essayer, semble travailler comme prévu. Cela peut-il être transformé en une seule requête (pas deux sélectionnées séparées)? Ne signifiera probablement pas beaucoup de performances sage, mais je voulais juste vérifier. Néanmoins, il semble résoudre la question que j'ai posée, afin de pouvoir uppoter et de marquer comme une solution. Merci encore. :)



0
votes

Vous pouvez remplacer la liste des pageId code> S de l'opérateur dans code> avec une liste séparée par des virgules et utilisez group_concat () code>:

SELECT chatId
FROM chatParticipants 
GROUP BY chatId
HAVING GROUP_CONCAT(DISTINCT pageId ORDER BY pageId) = (
  SELECT GROUP_CONCAT(pageId ORDER BY pageId) FROM (
    SELECT '123' pageId UNION ALL 
    SELECT '144' UNION ALL
    SELECT 'deb47fba9bc6936ed76e831578baa480' 
  ) t
) 


2 commentaires

Merci pour la suggestion forpas. J'ai essayé quelque chose de similaire à celui-ci précédemment. Comment suggéreriez-vous de faire la déclaration préparée pour empêcher les attaques, en utilisant une chaîne séparée par des virgules? Et l'ordre de la liste aura-t-il une signification? Les identifiants de page ne sont pas présélectionnés par moi, car ils sont dynamiques aux utilisateurs qui choisissent et peuvent être dans un ordre différent.


Pour la 1ère requête, vous devez utiliser une instruction préparée avec 1 ? espace réservé comme: Sélectionnez Chatid ... avoir group_concat (ordre de page distinct par pageId) =? puis passez la chaîne de la liste séparée des virgules. En Java, ce serait quelque chose comme: Paretstatement.SetString (1, ListOfvalues); Mais la variable ListOfvalues ​​ doit contenir les pagraphes triés. Vous devez donc faire le tri de la liste avant, puis concaténer les valeurs avec , comme séparateur. Pour la 2e requête, vous devez utiliser 1 ? espace réservé pour chacun des pages qui n'ont pas besoin d'être triés.