0

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

有一个列 (gangs_ocs_process.membersin),其中包含已加入的 ID 列表(即 1、2、5)。我正在尝试一次性获取每个 ID 的用户名(从users表中)。

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

如果我替换1,2,4ocp.membersin(放置文字列表而不是列名),它可以正常工作。它返回一个包含用户名 ( image ) 的列。但是,如果我离开 ocp.membersin,我会收到以下错误:

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

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

任何帮助都会很棒:)

4

6 回答 6

2

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

于 2009-02-20T13:47:19.490 回答
2

如果您的表中有分隔字符串,则说明您的数据库存在设计问题。添加一个新表来保存这些值。

于 2009-02-20T14:27:10.270 回答
0

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

于 2009-02-20T13:11:46.707 回答
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
于 2009-02-20T13:16:55.540 回答
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
于 2009-02-20T13:16:57.457 回答
0

您确定“membersin”在“gangs_ocs_process”表中,而不是“gangs_ocs”表中吗?

于 2009-02-20T13:17:57.797 回答