SQL问题,LEFT JOIN [..] IN()

时间:2009-02-20 13:08:51

标签: mysql sql join mysql-error-1054

这个小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 

Theres a column(gangs_ocs_process.membersin),其中包含已加入的ID列表(即1,2,5)。我试图一次性获取每个ID(来自users表)的用户名。

问题是LEFT JOIN users u ON u.userid IN ( ocp.membersin )

如果我将1,2,4替换为ocp.membersin(放置文字列表而不是列名),它就可以了。它返回一个具有用户名(image)的列。但是,如果我留在ocp.membersin中,我会收到此错误:

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

这是我第一次在左连接中使用IN,所以我有点迷失。

任何帮助都会很棒:)

6 个答案:

答案 0 :(得分:2)

我认为“IN”不适用于此语法。 MySQL期望IN类似于数据集,而不是分隔字符串。我认为您需要找到一种方法来获取成员,将其扩展为MySQL可以使用的数据集(可能是临时表),并加入其中。

答案 1 :(得分:2)

如果表中包含分隔符,则数据库中存在设计问题。添加一个新表来保存这些值。

答案 2 :(得分:0)

你无法让它工作的原因是首先你需要让你的数据库正常化。你永远不应该在一个列中有一个ID列表。

答案 3 :(得分:0)

这是糟糕的方式来保持会员资格。

但如果您仍然需要使用它,您可以尝试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

答案 4 :(得分:0)

再看看之后,我认为你的问题是试图在错误的点和IN语法中聚合,你应该在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

答案 5 :(得分:0)

你确定'membersin'在'gangs_ocs_process'表中,而不是'gangs_ocs'表吗?

相关问题