MySql:获得至少N个元素

时间:2011-10-24 19:50:42

标签: mysql

如何在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

只返回所需的最小元素。

一些例子:

  • 如果表格包含4个新项目,则查询应返回4个新项目和最新的非新项目
  • 如果表格包含7个新项目,则查询应仅返回7个新项目
  • 如果表格包含1个新项目,则查询应返回新项目和4个非新项目。

6 个答案:

答案 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
  • UNION的第一部分返回所有新项目。
  • UNION的第二部分返回前五个新项目,或者如果项目少于5个,则返回所有新项目,然后返回前5个旧项目。
  • UNION删除结果集中的所有重复项。

请注意,这假设在表中的任何列或列组合上定义了唯一键(例如,如果您的表具有主键,则该键应该有效)。

答案 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>