2013-07-17 70 views
0

我有一個包含管理員ID和員工編號(以逗號分隔)的表,我有以下SQL語句:需要幫助縮短MySQL的多個OR條件

 
SELECT manager_id, staff_ids 
FROM manager_staffs 
WHERE 1 IN (staff_ids) 
OR 3 IN (staff_ids) 
OR 5 IN (staff_ids) 
OR 23 IN (staff_ids) 
OR 12 IN (staff_ids) 
OR 16 IN (staff_ids) 
OR 19 IN (staff_ids) 
OR 32 IN (staff_ids) 
OR 123 IN (staff_ids) 
............ 

基本上,這是一個很長的查詢與很多'OR'條件。如果有辦法,我想改善或縮短它。

需要所有sql大師的幫助。

+0

staff_ids是否包含逗號分隔的工作人員ID列表字段?如果是這樣,你的查詢就不會起作用,除非經理有一名員工。如果它是一個逗號分隔的列表,那麼你應該將列表拆分到另一個表格上,每個員工在該新表格上有一行 – Kickstart

回答

0

你爲什麼不試試這個

SELECT manager_id, staff_ids 
    FROM manager_staffs 
    WHERE staff_ids IN (1,3,5,23,12,16,19,32,123,.......) 
  • 你沒有選擇,如何降低你的OR唯一的,如果你創建其他表並選擇他們喜歡上面的查詢。

  • 構造您的表格最好在檢索數據時獲得性能。

你的表應該看起來像

manager_staff 
manager_id , staff_id 
    1   1 
    1   3 
    1   5 
    1   23 
    .......... 
+0

我不認爲這會起作用。按照他的說法,staff_ids用逗號隔開 –

+0

是的。它們用逗號分隔。 –

+0

其你的結構錯了你應該用staff_ids創建其他表,然後你通過我的查詢得到他們 –

0

林不知道什麼是你想實現,但試試這個:

SELECT經理標識,staff_ids FROM manager_staffs WHERE staff_ids在('1','3'等)

0

假設staff_ids是一個逗號分隔的字段,那麼你可以做到以下幾點。

SELECT DISTINCT manager_id, staff_ids 
FROM manager_staffs a 
INNER JOIN (SELECT 1 AS staff_id UNION SELECT 3 UNION SELECT 5 UNION SELECT 23 UNION SELECT 12 UNION SELECT 16 UNION SELECT 19 UNION SELECT 32 UNION SELECT 123) b 
ON FIND_IN_SET(b.staff_id, a.staff_ids) > 0 

但正如我前面的評論,分裂它會是一個更好的主意

1

的問題是你的數據結構 - 不要把所有的工作人員在IDS一列。做一個表 - 你可以把它叫做manager_staff:

CREATE TABLE manager_staff (
    manager_id int, 
    staff_id int 
); 

所以你可以做好記錄,顯示其經理每一位員工的人報告。然後您的查詢變爲:

select manager_id, staff_id from manager_staff where staff_id in (1,3,...); 
+0

感嘆。抱歉。我希望我能改變。 –