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)をTheresの。私は一度にこれらのID(users
テーブルから)のそれぞれについて、ユーザ名を取得しようとしています。
問題がLEFT JOIN users u ON u.userid IN ( ocp.membersin )
である
私は1,2,4
のために(代わりに、列名のリストリテラルを置く)でocp.membersin
をsubstitue場合は、[OK]を動作します。これは、ユーザ名(画像を)有するカラムを返します。私はocp.membersinに残す場合は、私はこのエラーを取得します:
#1054 - Unknown column 'ocp.membersin' in 'on clause'
これは私も左にで使用した最初の時間は、私は少し迷ってしまいました合流されます。
すべてのヘルプは素晴らしいことだ:)
解決
私は「IN」はこの構文のために働くだろうとは思いません。 MySQLはINがデータセットではなく、区切られた文字列に似て何かをすることを期待しています。私はあなたがMySQLが(多分一時テーブル)で作業することができ、データセットにそれを展開し、membersinを取るための方法を見つける必要があると思うし、それに参加しています。
他のヒント
あなたは、テーブル内の文字列を区切っている場合は、データベースの設計上の問題を抱えています。これらの値を保持する新しいテーブルを追加します。
あなたは必ず 'membersin' 'gangs_ocs_process' テーブルであり、そしてない 'gangs_ocs' テーブル?
あなたはそれが仕事を得ることができない理由があります。あなたは、EVER 1列にIDのリストを持っていることはありません。
別の表情を取った後、私はあなたの問題は、間違ったポイントなどの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
これは、メンバーシップを維持するための悪い方法のです。
しかし、あなたはまだそれと一緒に暮らすために必要がある場合、あなたは会員のためにテストする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