2012-07-24 107 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