2013-08-16 57 views
0

我想找到一個MySQL要求3個的某些行,可以說,例如行5,第10和15找到3個某些行

我知道我可以做3單要求與

SELECT * FROM \`table\` WHERE \`value\` = '$value' LIMIT 4,1 
SELECT * FROM \`table\` WHERE \`value\` = '$value' LIMIT 9,1 
SELECT * FROM \`table\` WHERE \`value\` = '$value' LIMIT 14,1 

但是不是有一個更簡單的方法來做到這一點,並把一切都變成一個查詢?

+0

你可以'聯合'他們togehter或確保值='值'只顯示5,10,15我不知道上下文,所以這可能不是一個選項 –

+1

你可能要小心,因爲MySQL不保證沒有ORDER BY條款的響應中數據的順序。 – msturdy

回答

0

嘗試UNION ALL:在MySQL

SELECT * FROM (SELECT * FROM `table` WHERE `value` = '$value' LIMIT 4,1) as tmp1 
UNION ALL 
SELECT * FROM (SELECT * FROM `table` WHERE `value` = '$value' LIMIT 9,1) as tmp2 
UNION ALL 
SELECT * FROM (SELECT * FROM `table` WHERE `value` = '$value' LIMIT 14,1) as tmp3 
+0

當表格可能有重複時,請勿使用UNION –

+0

當表格可能有重複時,請勿使用UNION ALL請參閱http://sqlfiddle.com/#!2/6bbb1/1我可以得到一個結果。 –

+0

OP需要3行出現在第5,10和15位,因此可以說,如果第5行與第10和第15行相同。所以結果集將有3行完全相同,我認爲這是OP所需要的 –

2

行並沒有排序,這意味着,他們可以在任何順序返回。因此,您提出的使用LIMIT的解決方案將無法永久工作。請添加一個ID屬性並像下面一樣查詢您的日期。

SELECT * FROM `table` 
WHERE `value` = '$value' 
    AND `ID` in (5, 10, 15) 
+0

OP需要第5條第10條和第15條記錄,這怎麼可能適用於所有情況 –

+1

如果表中有AUTO_INCREMENT ID如果刪除引起的iD增量沒有間隔,這也是可能的。 –

0

根據它們的位置引用行幾乎不是一個好主意。使用主鍵。如果你沒有主鍵 - 添加一個。

如果你是絕對確信你真的需要通過自己的位置引用行,你可以使用UNION(如Sashi康德的答案),或者你可以給他們序列號和過濾對他們這樣的:

SELECT * 
FROM (SELECT 
    @[email protected]+1 as i, 
    t.* 
    FROM `table` t 
    JOIN (SELECT @i:=0) #0 will make the row index 1-based, if you need 0-based you can change it to -1 
    WHERE `value` = '$value' 
    ORDER BY <something> 
    LIMIT 15 #the max row num you want 
) as t 
WHERE t.i IN (5,10,15) 
+0

注意:如果您使用INNODB作爲存儲引擎,則應始終在表中添加PRIMARY KEY或UNIQUE KEY。我寫了一篇關於dba stackoverflow的文章http://dba.stackexchange.com/questions/48072/why-does-mysql-ignore-the-index-even-on-force-for-this-order-by/48184 #48184 –