2012-06-19 79 views
0

組合兩個SELECTS我有一個項目的表在其中:來自同一個表

  • ID(INT)
  • 排序(INT)
  • 內容(串)

我的項目頁面顯示當前項目和接下來三個項目的預覽。爲了獲取接下來的三個項目,我想使用一個乾淨的MySQL查詢。當然,如果這個人是最後一個項目中的一個,那麼還沒有剩下3個項目要展示。

因此,它需要再次顯示第一個。

基本上我試着去這兩個語句組合:

SELECT * 
FROM projects 
WHERE ordering > {currentProjectOrdering} 
ORDER BY ordering ASC 

SELECT * 
FROM projects 
WHERE ordering > 0 
ORDER BY ordering ASC 

LIMIT 0,3 

一言以蔽之:有高於排序得到下三個記錄目前的項目,如果(一些)這些不存在,從訂購= 1開始。

假設有10個項目: 項目1顯示2,3和4 項目2顯示3,4和5 ... 項目9顯示10,1和2

+2

爲什麼不只是把兩個where語句結合起來? – bnvdarklord

+0

聯盟是你想要的嗎? – VanessaBR

+0

這麼簡單....將兩個where子句結合在一個SELECT中...... –

回答

2

如果你想從數據第一個條件秒病症使用

SELECT * 
FROM projects 
WHERE ordering > {currentProjectOrdering} AND ordering > 0 
ORDER BY ordering ASC 
LIMIT 0,3 

如果你想從第一個條件秒病症使用的數據

SELECT * 
FROM projects 
WHERE ordering > {currentProjectOrdering} OR ordering > 0 
ORDER BY ordering ASC 
LIMIT 0,3 
+0

感謝您清除此錯誤,遺憾的是,這不是我的意思: OR語句將獲得我所有的結果,AND語句將獲得所有結果與當前項目相比,「訂購」的價值更高。我想要實現的是:獲取接下來的三個記錄,其排序比當前項目更高,如果(某些)這些不存在,則從order = 1開始。 – Michiel

0

這樣的事情應該工作(假定您只是限制項目的那個人正在研究):

 SELECT * FROM projects WHERE person = person_id && (ordering > 0 && COUNT(id) < 4) 
|| (ordering >= currentProjectOrdering && COUNT(id) >= 4)) ORDER BY ordering LIMIT 0,3; 
+0

謝謝shawn,但我不認爲這個聲明會讓我得到我期待的結果,你認爲你能解釋你向我詢問? – Michiel

+0

耶基本上它依靠操作的順序來獲得你想要的。因此,在僞代碼中,where語句是:if person == person_id then then ordered大於0並且少於4個項目,那麼如果排序大於或等於currentProjectOrdering,那麼選擇其他記錄,並且有4個或更多記錄用戶返回頂部4. –

0

我很好奇這一點。我沒有mysql並且無法測試,但是我不想認爲您將在這些示例中獲得您想要的3條記錄 - 如果您位於列表的末尾並且需要抓取1或2個從一開始就。我在玩TSQL - 所以沒有LIMIT因此TOP

我也很好奇,如果任何人都可以做得更好。

SELECT TOP 3 
    CASE 
    WHEN ORDERING >= {currentProjectOrdering} THEN ORDERING 
    ELSE {currentProjectOrdering} - ORDERING END AS DISPLAYORDER,* 
FROM SO_projects 
WHERE (ordering >= {currentProjectOrdering} AND ordering < {currentProjectOrdering}+ 3) OR ordering < 3 
ORDER BY DISPLAYORDER DESC 

不能承諾,因爲我不知道MYSQL,但這裏是我的嘗試。在T-SQL中TOP根據ORDER BY返回指定的recs數(在這種情況下爲3)。 LIMIT的0,3部分(我希望)中沒有0的含義。我GOOGLE了,它看起來像CASE的東西應該是非常相似。由於LIMIT的工作原理,您可能會擺脫>和<。SqlServer上的邏輯工作原理:

SELECT 
    CASE 
    WHEN ORDERING >= {currentProjectOrdering} THEN ORDERING 
    ELSE {currentProjectOrdering} - ORDERING END AS DISPLAYORDER,* 
FROM SO_projects 
WHERE (ordering >= {currentProjectOrdering} AND ordering < {currentProjectOrdering} + 3 ) OR ordering < 3 
ORDER BY DISPLAYORDER DESC 
LIMIT 0,3 
+0

似乎是合法的,太糟糕了我不知道如何寫這個fr mysql :-(感謝你的時間,雖然! – Michiel

+0

我編輯並試試給你。 – user1166147