0

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

通过使用以下查询,我能够做到这一点:

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

伟大的。但是...在极少数情况下会同时添加一大堆交易,因此我需要某种覆盖来指定应该“精选”哪个交易。我添加了一个布尔值 [featured] 并测试了以下查询:

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

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

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

有任何想法吗?

多谢你们。

4

4 回答 4

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 是唯一的,就像我假设的那样,如果它们以相反的方式排序,则不会使用特色布尔值。

于 2012-07-24T09:20:27.840 回答
0

如果你只是想组合这两个查询,你可以只组合 where 子句 - 先按 deal_id 排序,然后如果有多个具有相同的 deal_id,然后它会按是否有特色来排序:

SELECT *
FROM   deals
WHERE  datestart < Now()
       AND dateend > Now()
ORDER  BY deals.deal_id DESC,
          deals.featured DESC
于 2012-07-24T09:15:51.857 回答
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;
于 2012-07-24T09:24:03.780 回答
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;

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

于 2012-07-24T09:27:04.573 回答