我有一个满是交易的数据库,以及一个网站,如果这笔交易是特色交易,它将只展示其中一个交易,但我正在努力获得正确的逻辑...... 网站上显示的交易必须 一个。在有效的日期范围内 湾是最近添加的数据库交易
通过使用以下查询,我能够完成此任务:
"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"
它有效,但现在我需要指定特色交易,否则特色交易将被随机选择?而我只想把它作为覆盖。
所以我需要以某种方式结合上述两个脚本。
任何想法?
谢谢你们。答案 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;
理想情况下,您只需将这两个查询合并为一个更新选择,但当时无法做到这一点。