2012-09-22 58 views
1

我有以下MySQL查詢:如何在MYSQL中自定義'Order BY'?

SELECT merchantNames.strippedName,merchantNames.lastCached,merchantNames.id 
FROM merchantNames 
JOIN autoCoupons 
ON merchantNames.rawName = autoCoupons.merchantName 
WHERE NOW() > autoCoupons.startDate AND autoCoupons.startDate > merchantNames.lastCached 
OR NOW() > autoCoupons.endDate AND autoCoupons.endDate > merchantNames.lastCached 
OR NOW() > autoCoupons.timeAdded AND autoCoupons.timeAdded > merchantNames.lastCached 
OR merchantNames.lastCached < NOW() - INTERVAL 2 DAY 
GROUP BY merchantNames.strippedName 
ORDER BY merchantNames.pageviews DESC 

如何設置這個查詢訂購這樣的結果,那些滿足前三行的WHERE子句條件是在頂部和那些只有滿足底線纔是底線?

回答

1

還有其他的方法得到你想要的查詢的結果,但對於「定製ORDER BY」,你可以通過一個布爾子句的結果的順序。 DESC將首先將(1)結果和第二個結果爲假(0)。就你而言,使用嵌套的SELECT(下面)讀取和寫入這個查詢是最簡單的,但是當然你可以用ORDER BY中的顯式條件編寫更長的查詢,這可能會更快。

SELECT r.strippedName, r.lastCached, r.id 
FROM 
    (SELECT 
     merchantNames.strippedName, 
     merchantNames.lastCached, 
     merchantNames.id, 
     merchantNames.pageviews, 
     (NOW() > autoCoupons.startDate AND autoCoupons.startDate > merchantNames.lastCached) AS a, 
     (NOW() > autoCoupons.endDate AND autoCoupons.endDate > merchantNames.lastCached) AS b, 
     (NOW() > autoCoupons.timeAdded AND autoCoupons.timeAdded > merchantNames.lastCached) AS c, 
     (merchantNames.lastCached < NOW() - INTERVAL 2 DAY) AS d 
    FROM merchantNames 
    JOIN autoCoupons ON merchantNames.rawName = autoCoupons.merchantName 
    GROUP BY merchantNames.strippedName) AS r 
WHERE r.a OR r.b OR r.c OR r.d 
ORDER BY (r.a OR r.b OR r.c) DESC, pageviews DESC 
+0

所以如果我正確地理解了你,這些行末尾的AS會從AND的兩端收集它的布爾結果,而不僅僅是從它的尾部結束? –

+0

你可以放在括號內以確保。 – jmilloy

+0

它有效,但它只有一些非常小的錯誤,所以不要批評,但要幫助清除它,我會解釋它們。您需要在'AS a'和'AS b'之後添加逗號。另外,我需要在'merchantNames.id'下面添加'merchantNames.pageviews',以便能夠在最終的ORDER BY子句中使用它。再次感謝! –

3

將查詢分爲兩部分並使用UNION將結果結合在一起。