2010-02-13 23 views
5

這可能不太明智,但如果WHERE IN子句中存在重複條件,我想讓MySQL返回確切的重複行。這可能嗎?強制MySQL從WHERE IN子句中返回重複項而不使用JOIN/UNION?

拿這個例子:

SELECT 
    columns 
FROM 
    table 
WHERE 
    id IN(1, 2, 3, 4, 5, 1, 2, 5, 5) 

I'ld如MySQL 5個三倍,ID的1和2兩次,3和4回我行與ID一次。

作爲的IN參數的lenght,以及重複的次數(一次,兩次,三次,等),將被適當地我不想依靠UNIONJOIN。是否有可能這樣呢?

回答

2

我不確定你爲什麼要禁止JOIN作爲它對於SQL來說非常重要。這就像禁用函數式語言中的函數調用一樣。

解決此問題的一個好方法是創建一個結果集,其中包含要返回並加入的id。這裏有一種方法:

SELECT Table1.* 
FROM Table1 
JOIN (SELECT 1 AS id 
     UNION ALL SELECT 2 
     UNION ALL SELECT 3 
     UNION ALL SELECT 4 
     UNION ALL SELECT 5 
     UNION ALL SELECT 1 
     UNION ALL SELECT 2 
     UNION ALL SELECT 5 
     UNION ALL SELECT 5) AS T1 
ON Table1.id = T1.id 

我不確定你是否考慮過這種方法?它沒有任何你似乎害怕的問題。

如果你禁止連接,你不能這樣做,除非你使用存儲過程,我認爲這比存儲過程更糟糕。

+0

嗨馬克,謝謝你的回答。從外觀上看,我想我只需要加入JOIN和UNION即可。我不知道你在這裏使用UNION的方式。我甚至不確定我完全理解它。 :)但它看起來非常漂亮!我之所以不想首先使用UNION,是因爲我認爲我必須一遍又一遍地重複精確的SELECT語句。這看起來很乾淨。 – 2010-02-13 22:00:21

+0

順便說一句,這些聯盟會保證結果的確切順序,還是我仍然需要使用ORDER子句來按照他們在聲明中的順序排序? – 2010-02-13 22:03:36

+0

如果您想保證訂單,您*需要訂購。這總是如此。幸運的是,很容易改變上面的查詢:'SELECT 1 as ID,1 as SortOrder UNION ALL SELECT 2,2 UNION ALL SELECT 3,3' etc ... then'ORDER BY SortOrder'''JOIN ..在...上。 – 2010-02-13 22:12:42