Question

Cette petite erreur SQL me tracasse. (?) Il ne semble pas être un problème avec la requête, juste la portée, des exemples qui fonctionnent le mieux:

SELECT ocp.*, oc.*, GROUP_CONCAT( u.username SEPARATOR ', ') AS `memjoined`
FROM gangs_ocs_process ocp, gangs_ocs oc
LEFT JOIN users u ON u.userid IN ( ocp.membersin )
WHERE ocp.ocid =1 AND ocp.gangid =1 AND oc.oc_name = ocp.crimename
GROUP BY ocp.ocid
LIMIT 0 , 30 

Theres une colonne (gangs_ocs_process.membersin) qui comporte une liste d'ID qui ont adhéré (c.-à-1,2,5). Je suis en train d'obtenir les noms d'utilisateur pour chacun de ces ID (de la table users) en une seule fois.

Le problème est LEFT JOIN users u ON u.userid IN ( ocp.membersin )

Si je Substitue 1,2,4 dans pour ocp.membersin (mettre la liste littérale au lieu du nom de la colonne), il fonctionne bien. Elle renvoie une colonne qui contient les noms d'utilisateur ( l'image ). Cependant, si je laisse dans le ocp.membersin, je reçois cette erreur:

#1054 - Unknown column 'ocp.membersin' in 'on clause'

Ceci est la première fois que je l'ai même utilisé dans des gauche rejoint donc je suis un peu perdu.

Toute aide serait grande:)

Était-ce utile?

La solution

Je ne pense pas que « IN » fonctionnera pour cette syntaxe. MySQL attend IN d'être quelque chose de semblable à un jeu de données, pas une chaîne délimitée. Je pense que vous avez besoin de trouver un moyen de prendre membersin, développez dans un jeu de données MySQL peut fonctionner avec (peut-être une table temporaire) et joignez-vous à ce sujet.

Autres conseils

Si vous avez délimité des chaînes dans votre table, vous avez un problème de conception dans votre base de données. Ajouter une nouvelle table pour maintenir ces valeurs.

Êtes-vous sûr 'membersin' est dans la table 'gangs_ocs_process', et non la table '' gangs_ocs?

La raison pour laquelle vous ne pouvez pas le faire fonctionner est parce que vous devez d'abord obtenir votre base de données NORMALISÉE. Vous ne devez JAMAIS, JAMAIS avoir une liste des numéros d'identification dans une seule colonne.

Après avoir pris un autre regard, je pense que votre problème est d'essayer d'agréger au mauvais endroit, ainsi que la syntaxe IN et que vous devez regrouper dans une sous-requête restreinte par le contenu du IN. Je ne sais pas assez sur votre schéma pour en faire de la bonne case, mais vous voulez quelque chose comme ça. SomeKeyfield devrait rapporter à gangs_ocs_process

SELECT ocp.*, oc.*, u.Memjoined
FROM gangs_ocs_process ocp, gangs_ocs oc
LEFT JOIN (Select SomeKeyField, GROUP_CONCAT( u.username SEPARATOR ', ') as memjoined
            from  users where userid in
            (select membersin from gangs_ocs_process 
             where [whatever conditions] )
             Group By SomeKeyField) u on ocp.SomeKeyField = u.SomeKeyField

WHERE ocp.ocid =1 AND ocp.gangid =1 AND oc.oc_name = ocp.crimename
GROUP BY ocp.ocid
LIMIT 0 , 30

Ceci est un moyen mauvais pour maintenir l'adhésion.

Mais si vous avez encore besoin de vivre avec elle, vous pouvez essayer la correspondance de REGEXP pour tester l'adhésion:

SELECT ocp.*, oc.*, GROUP_CONCAT( u.username SEPARATOR ', ') AS `memjoined`
FROM gangs_ocs_process ocp
LEFT JOIN users u ON (ocp.membersin RLIKE CONCAT('(^|,)[[:blank:]]?', userid, '[[:blank:]]?($|,)'))
JOIN gangs_ocs oc ON (ocp.ocid = 1 AND ocp.gangid = 1 AND oc.oc_name = ocp.crimename)
GROUP BY ocp.ocid
LIMIT 0 , 30
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top