2009-02-20 58 views
0

這個小SQL錯誤正在困擾着我。 (?)它似乎並沒有要與查詢問題,只是範圍,例子最好:SQL問題,左加入[..] IN()

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列表的列(gangs_ocs_process.membersin)(即1,2,5)。我試圖一次性獲取每個ID的用戶名(來自users表)。

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

如果我substitue在1,2,4ocp.membersin(把文字列表,而不是列名),它工作正常。它返回一個包含用戶名(image)的列。但是,如果我在ocp.membersin離開,我得到這個錯誤:

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

這是我甚至在左邊用在第一次連接,因此我有點失落。

任何幫助將是巨大的:)

+0

對於100萬次編輯感到抱歉。你能否詳細說明gangs_ocs_process,gangs_oc和用戶之間的關係。 – cmsjr 2009-02-20 13:54:51

+0

沒關係。該關係並不重要,因爲它將字段作爲字符串返回,對於只需要值列表的IN而言,該關係無法正常工作。大部分編輯工作確實奏效,但我們兩人似乎都錯過了這一點,直到Jeremy在那裏指出它 – damnitshot 2009-02-20 14:06:10

回答

2

我不認爲「IN」適用於此語法。 MySQL期望IN類似於數據集,而不是分隔字符串。我認爲你需要找到一種方法來接收成員,將其擴展到MySQL可以使用的數據集(也許是一個臨時表),然後加入。

0

你不能得到它的工作的原因是因爲首先你需要得到你的數據庫標準化。你永遠不應該在一列中有一個ID列表。

+0

我正在使用(嘗試)IN,因爲membersin col有多個值,並且我從用戶表(將它們與GROUP_CONCAT()分組)。我也嘗試過你的方法,但它仍然說未知列。 – damnitshot 2009-02-20 13:13:49

+0

好吧,那麼你的問題很簡單 - 你的數據庫是非常規的,這就是你的問題的根源。 – 2009-02-20 13:17:12

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 
+0

它似乎部分工作,我把它移回到你發佈的兩個連接。然而,即使'membersin`列是'1,2,3',它只會返回一個'users`行(我使用與上面相同的IN()語法),但錯誤沒有出現。 – damnitshot 2009-02-20 13:30:25

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 
0

你確定「membersin」是在「gangs_ocs_process」表,而不是「gangs_ocs」表?

2

如果您的表中有分隔的字符串,則說明數據庫中存在設計問題。添加一個新表來保存這些值。