如何在MySQL查询中表达:“获取所有新元素但至少有N个元素”。
我会试着更好地解释一下。我想知道如果我有一个产品列表[产品,价格,日期,新]如何进行查询,我想向用户显示所有新元素,但如果少于N个元素(例如5)也显示最后的项目。如果可以在如下的查询中思考:
SELECT * FROM `products` WHERE new='1' ORDER BY date DESC
但这只会返回所有新元素,并且:
SELECT * FROM `products` WHERE new='0' ORDER BY date DESC LIMIT 5
只返回所需的最小元素。
一些例子:
答案 0 :(得分:4)
使用UNION组合两个结果集。
(
SELECT *
FROM `products`
WHERE new = '1'
)
UNION
(
SELECT *
FROM `products`
ORDER BY new DESC, date DESC
LIMIT 5
) T1
ORDER BY new DESC, date DESC
请注意,这假设在表中的任何列或列组合上定义了唯一键(例如,如果您的表具有主键,则该键应该有效)。
答案 1 :(得分:1)
new
订购,而不仅仅是date
SELECT * FROM `products` ORDER BY new, date DESC
答案 2 :(得分:0)
我认为你能做的最好的是UNION
两个选项:1)所有新项目和2)最少数量的附加项目。然后在应用程序逻辑中确定要显示的行。 SQL不提供语法来执行您所要求的操作。
编辑:实际上,也许可以使用用户定义的变量来做到这一点。尽管如此,对UNION
执行{{1}}的工作(对于MySQL服务器来说)可能要少一些。
答案 3 :(得分:0)
SELECT *, @rownum := @rownum + 1 AS rownum
FROM products, (SELECT @rownum := 0) AS vars
ORDER BY new DESC, date DESC
HAVING rownum <= 5 OR new = 1
答案 4 :(得分:0)
select * from products order by new desc, date desc limit 5
这假设“new”列中只有1或0的值。
答案 5 :(得分:0)
伪代码:
CREATE STOREPROCEDURO
(
@howMany INT
)
Declare @nNew INT
Declare @nOld INT
SET @nNew = (select count(*) from table where new = 1 order by date desc)
set @nOld = (select count(*) from table where old = 1 order by date desc)
set @nOld = @howMany - @nNew
if (@nOld < 0)
begin
@nOld = 0
end
(select top (@nNew) * from table where new = 1 order by date desc)
union
(select top (@nOld) * from table where new = 0 order by date desc)
</code>