J'essaie de vérifier si plusieurs enregistrements existent avec Ceci est un exemple de la Structure de la table:
C'est la requête SQL que j'ai essayée: p> Comportement attendu: < / fort> p> Le SQL ci-dessus fonctionne, avec deux entrées. Cependant, la requête ci-dessous renvoie toujours le 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. P> edit 2: strong> p> Ce SQL retournera deux identifiants de discussion. p> sortie: p> En fait, la sortie attendue ne doit renvoyer que l'ID de chat pour Toutes idées? P> P> pageID dans (?,?,?) code> dans le
Chatparticipants code> Table.
p>
chatide code>. li>
ul>
chatide code>, lequel ne devrait pas. (Comme il a le "144" qui n'est pas un participant) p>
p>
43BCD7340F1ABF7eda09FCCCFFDBFE60 code> P>
3 Réponses :
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
. . 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.
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
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. :)
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
)
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 ? Code> espace réservé comme:
Sélectionnez Chatid ... avoir group_concat (ordre de page distinct par pageId) =? Code> puis passez la chaîne de la liste séparée des virgules. En Java, ce serait quelque chose comme:
Paretstatement.SetString (1, ListOfvalues); Code> Mais la variable
ListOfvalues code> doit contenir les pagraphes triés. Vous devez donc faire le tri de la liste avant, puis concaténer les valeurs avec
, code> comme séparateur. Pour la 2e requête, vous devez utiliser 1
? Code> espace réservé pour chacun des pages qui n'ont pas besoin d'être triés.
Je ne sais pas pourquoi la somme
somme () code> est utilisée sur une colonne contenant des données non numériques
@Riggsfolly: ce
somme code> 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?