2012-07-24 108 views
0

我有一個數據庫充滿了交易,並且一個網站將呈現這些交易中的一個,如果交易是特色交易,但是我正在努力獲得正確的邏輯...... 交易是在網站上顯示必須 a。在有效日期範圍內 b。是最近添加的協議,數據庫MySQL的查詢邏輯

通過使用下面的查詢,我能做到這一點:

"SELECT * FROM deals WHERE datestart < now() AND dateend > now() ORDER BY deals.deal_id DESC" 

大。然而,在極少數情況下,一次性添加了一大堆交易,所以我需要某種重寫來指定哪個應該是「特色」。 我加了一個布爾值[功能]並測試了以下查詢:

"SELECT * FROM deals WHERE datestart < now() AND dateend > now() ORDER BY deals.featured DESC" 

它的工作,但現在我需要指定交易功能,否則特色的交易將隨機選擇?而我只想把它作爲一個覆蓋。

因此,我需要以某種方式組合上述2個腳本。

有什麼想法?

謝謝你們。

+0

爲什麼'WHERE'子句中沒有'featured = 1'? – 2012-07-24 09:19:30

回答

1

向WHERE子句添加布爾值比較,並將結果數限制爲1.當通過deal_id排序時,這將始終返回相同的結果。

SELECT * 
FROM deals 
WHERE datestart < now() AND dateend > now() AND deals.featured IS TRUE 
ORDER BY deals.deal_id DESC 
LIMIT 1 

編輯:

這裏是一個另類,所以你不必添加更多的WHERE子句。

SELECT * 
FROM deals 
WHERE datestart < now() AND dateend > now() 
ORDER BY deals.featured DESC, deals.deal_id DESC 
LIMIT 1 

ORDER子句的順序很重要,如果DEAL_ID的是獨一無二的,因爲我認爲他們的功能,如果他們被下令全面相反的方式布爾將無法使用。

+0

事情是,我不希望他們必須通常將交易指定爲真(所有交易理想情況下都會有bool = 0)。 – 2012-07-24 09:24:00

+0

特色只是一個覆蓋 – 2012-07-24 09:24:23

+0

您可以將_deals.featured_移動到ORDER子句中,仍將結果限制爲1,從而允許您檢索最近的特色處理。 – dstrachan 2012-07-24 09:33:08

0

如果你只是想結合這兩個查詢,你可以結合where子句 - 先按deal_id排序,然後如果有多個具有相同的deal_id,那麼它將通過它是否有特色來進行排序:

SELECT * 
FROM deals 
WHERE datestart < Now() 
     AND dateend > Now() 
ORDER BY deals.deal_id DESC, 
      deals.featured DESC 
+0

我喜歡tho的樣子,但是在測試中它似乎忽略了第二條語句 – 2012-07-24 09:48:37

+0

@PeteNorris您是否實際上每deal_id有多行?這就是我認爲你的問題推斷 - 我猜這實際上並非如此。 – Bridge 2012-07-24 10:08:41

0

要得到你需要檢查featured IS TRUE和使用UNION ALL操作來覆蓋它精選優惠:

SELECT * 
FROM deals 
WHERE datestart < Now() 
     AND dateend > Now() 
     AND featured IS TRUE 
ORDER BY deal_id DESC 

UNION ALL 

SELECT * 
FROM deals 
WHERE datestart < Now() 
     AND dateend > Now() 
ORDER BY deal_id DESC; 
0

我認爲你正在試圖做的是以下幾點:

UPDATE deals 
SET featured=1 
WHERE datestart < now() AND dateend > now() 
ORDER BY deal_id DESC 
LIMIT 1; 

好,所以現在您試圖更新最新的有效特色交易並將其標記爲精選。如果受影響的行數爲0,那麼您已經擁有最近的有效特色交易,或者表中沒有任何有效交易(您可以選擇如何對此作出反應)。

如果受影響的行count爲1,那麼您只需找到一個新的,並且您需要選擇它(可能會將其填充到您的網站中)。選擇語句:

SELECT * 
FROM deals 
WHERE datestart < now() AND dateend > now() AND featured=1 
ORDER BY deal_id DESC 
LIMIT 1; 

理想情況下,您可以將這兩個查詢合併爲只有一個更新選擇,但當時沒有辦法做到這一點。

+0

但是,如果所有交易的特色設置爲'0',這不會打破? – 2012-07-24 09:32:45

+0

是的,你是對的。我認爲特色專欄已經被設置在各自的價值。如果你想選擇最近的特色交易,同時將其標記爲特徵= 1,你實際上需要兩個查詢,一個更新和一個選擇語句。 – mike56 2012-07-24 09:38:13

+0

我不認爲你可以給我的語法?我對這個東西很陌生。 – 2012-07-24 09:46:45