MySQL查询逻辑

时间:2012-07-24 09:13:00

标签: mysql logic

我有一个满是交易的数据库,以及一个网站,如果这笔交易是特色交易,它将只展示其中一个交易,但我正在努力获得正确的逻辑...... 网站上显示的交易必须 一个。在有效的日期范围内 湾是最近添加的数据库交易

通过使用以下查询,我能够完成此任务:

"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"

它有效,但现在我需要指定特色交易,否则特色交易将被随机选择?而我只想把它作为覆盖。

所以我需要以某种方式结合上述两个脚本。

任何想法?

谢谢你们。

4 个答案:

答案 0 :(得分: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是唯一的,正如我猜想的那样,如果以相反的方式对它们进行相反的排序,则不会使用特色布尔值。

答案 1 :(得分:0)

如果你只是想要结合两个查询,你可以只组合where子句 - 首先按deal_id排序,然后如果有多个具有相同deal_id的倍数,那么它将根据它是否具有特征来进行子顺序:< / p>

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

答案 2 :(得分: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;

答案 3 :(得分:0)

我认为您要做的是以下内容:

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

好的,现在您正在尝试更新最新的有效特色优惠,并将其标记为精选内容。如果受影响的行数为0,那么您已经拥有最新的有效特色交易,或者表中根本没有有效的交易(您可以选择如何对此做出反应)。

如果受影响的行数为1,那么您只需找到一个新行,然后您需要选择它(可能在您的站点中填充它)。选择语句:

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

理想情况下,您只需将这两个查询合并为一个更新选择,但当时无法做到这一点。