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 

参加した ID (つまり、1、2、5) のリストを持つ列 (gangs_ocs_process.membersin) があります。これらの ID ごとに (表から) ユーザー名を一度に取得しようとしていますusers

問題はLEFT JOIN users u ON u.userid IN ( ocp.membersin )

forを代入1,2,4するとocp.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」テーブルではなく、「gangs_ocs_process」テーブルにありますか?

于 2009-02-20T13:17:57.797 に答える