2009-08-04 65 views
2

這是我的情況:我想從數據庫中選擇所有條目WHERE id = $ id。但我希望將結果列入特定優先級。如果criteria = $ criteria,那麼我希望首先顯示這些結果。否則,我只想繼續顯示其餘的行。Mysql「操作順序」問題

我的問題是這樣的:這會解決我的問題嗎?

SELECT field1 WHERE (criteria=$criteria AND id = $id) OR id=$id LIMIT 5 

請問查詢()第一個?如果沒有,是否有另一種方法可以做到這一點,而不需要將其分解爲兩個單獨的查詢?

感謝,
邁克爾

回答

5
SELECT field1 
FROM mytable 
WHERE id = $id 
ORDER BY 
     criteria = $criteria DESC, id 
LIMIT 5 

,或者這樣:

SELECT * 
FROM (
     SELECT field1 
     FROM mytable 
     WHERE id = $id 
       AND criteria = $criteria 
     ORDER BY 
       id 
     LIMIT 5 
     ) q 
UNION 
FROM (
     SELECT field1 
     FROM mytable 
     WHERE id = $id 
     ORDER BY 
       id 
     LIMIT 5 
     ) q2 
ORDER BY 
     criteria = $criteria DESC, id 
LIMIT 5 

後者是更有效的,如果你有一個(id, criteria)指數(按照這個順序)。

+0

+1:這是我該怎麼做的。奇怪的是,你不能在沒有子查詢的情況下在Oracle中做這樣的事情,因爲Oracle的做法(rownumber)是在訂單之前應用的。 – Powerlord 2009-08-04 19:34:21

+0

DESC的位置是否重要? 我首先需要標準,就最高的ID到最低的ID而言。 它應該是標準= $標準,ID DESC而不是? – Dirk 2009-08-04 19:34:53

-1

不相關的原來的問題,只是爲了澄清:操作者與小於或具有更高的優先級,因此,爲什麼a或b和c或d是等於或(b和c)或d

0
SELECT field1 
    FROM mytable 
WHERE id = $id 
ORDER BY CASE WHEN criteria = $criteria THEN 0 ELSE 1 END CASE 
LIMIT 5; 

這將列出符合條件的行之前不是因爲零之前。

如果這不會直接合作 - 書面 - 然後把信息變成一個子查詢:

SELECT field1 
    FROM (SELECT field1, 
       CASE WHEN criteria = $criteria THEN 0 ELSE 1 END CASE AS ordering 
      FROM mytable 
     WHERE id = $id 
     ) AS subqry 
ORDER BY ordering 
LIMIT 5; 

通常情況下,還會有其他次要標準來確定行的0 VS中的順序1訂購。