有条件地限制来自 mySQL 的结果数量?

Posted

技术标签:

【中文标题】有条件地限制来自 mySQL 的结果数量?【英文标题】:Limit the amount of results from mySQL conditionally? 【发布时间】:2011-10-26 07:08:00 【问题描述】:

这是我的查询:

SELECT * FROM Photos WHERE Event_ID IN ($eventidstring)

我知道我可以使用 LIMIT 5 限制此查询的结果总数

我需要限制 $eventidstring 中每个值的结果数量。

所以如果 $eventidstring = 23,41,23*

*并且有 10 个结果 WHERE Event_ID = 23,我想将此数量限制为 5。$eventidstring 中的所有其他值都相同。

【问题讨论】:

请显示表定义 - CREATE TABLE 语句。 【参考方案1】:

mysql 中做类似于 Oracle 的 RANK by PARITION 的事情,您可能会很高兴。

遗憾的是,此功能在 MySQL 中不可用,但您可以使用 this method 解决它

将其转储到内联视图中,然后选择排名

因此:

SELECT t.* FROM (
SELECT ( 
        CASE Event_id 
        WHEN @curEventId 
        THEN @curRow := @curRow + 1 
        ELSE @curRow := 1 AND @curEventId := Event_Id END
      ) AS rank,
      p.*
FROM      Photos p INNER JOIN (SELECT @curRow := 0, @curEventId := '') r
ORDER BY p.Event_Id DESC
) t
WHERE t.rank <= 5 ORDER BY t.Event_Id asc;

考虑一下您将如何通过 Event_Id “选择”前五名。您可以随时在ORDER BY p.Event_Id DESC 之后添加更多内容来决定这一点。

【讨论】:

太棒了。这太不可思议了【参考方案2】:

我认为您是在 php 中的某处编写该查询,因此您需要将 $eventidstring 拆分为其组件值,在第一个之后为每个和 UNION 形成一个 SELECT。

您应该使用某种循环来执行此操作,并在循环中连接查询字符串...

【讨论】:

是的,这似乎是我除了上述解决方案之外的唯一解决方案【参考方案3】:

如果我理解正确并且您想获得 每个 5 个,您可以使用这个:

(SELECT * FROM Photos WHERE Event_ID = 23 LIMIT 5)
UNION
(SELECT * FROM Photos WHERE Event_ID = 41 LIMIT 5)
UNION
(SELECT * FROM Photos WHERE Event_ID = ... LIMIT 5)
...

【讨论】:

【参考方案4】:

也许使用 SELECT UNION 但您需要为每个值重新选择:

SELECT * FROM Photos WHERE Event_ID = 23 LIMIT 5
UNION SELECT * FROM Photos WHERE Event_ID = 41 LIMIT 5
UNION SELECT ...

【讨论】:

以上是关于有条件地限制来自 mySQL 的结果数量?的主要内容,如果未能解决你的问题,请参考以下文章

MySql 之 left join 查询结果

MySQL 修改账号的IP限制条件

在 Rails 上为连接、限制、选择等(不是条件)的 SQL 片段安全地转义字符串

有条件地创建游标?

Mysql语句,如何按两个不同条件查询数据~?

MySQL--操作数据表中的记录小结