SQL问题,LEFT JOIN [..] IN()
-
05-09-2019 - |
题
此小SQL误差窃听我。 (?)它似乎并没有要与查询问题,只是范围,例子最好:
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
即使世界具有ID的已加入列表(即1,2,5)的柱(gangs_ocs_process.membersin)。我想一气呵成,以获取每个这些ID(从users
表)的用户名。
问题是LEFT JOIN users u ON u.userid IN ( ocp.membersin )
如果我substitue在1,2,4
(把文字列表,而不是列名)ocp.membersin
,它工作正常。它返回一个具有用户名(图片)的柱。但是,如果我在ocp.membersin离开,我得到这个错误:
#1054 - Unknown column 'ocp.membersin' in 'on clause'
这是我甚至在左边用在第一次连接,因此我有点失落。
任何帮助将是巨大的:)
解决方案
我不认为“IN”将这个语法工作。 MySQL的预计是到数据集,而不是分隔字符串某种类似。我认为你需要找到一种方法,采取membersin,它扩展成一个数据集的MySQL可以(可能是临时表)的工作,并加入这一点。
其他提示
如果您已在表分隔的字符串,你在你的数据库设计问题。添加新的表来保存这些值。
你确定 'membersin' 是在 'gangs_ocs_process' 表,而不是 'gangs_ocs' 表?
您不能得到它的工作的原因是因为首先你需要得到你的数据库标准化。你应该永远,永远有一列ID的列表。
我们再看一下之后,我觉得你的问题是试图在错误的点还有语法聚集,那么你应该在汇总由IN的内容限制的子查询。我不知道有足够的了解您的架构,使这个开箱正确的,但你希望是这样的。 SomeKeyfield应与回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
这是一个坏的方式,以保持会员资格。
但是,如果你仍然需要忍受它,您可以尝试REGEXP
匹配来测试成员:
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