有条件地限制来自 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 的结果数量?的主要内容,如果未能解决你的问题,请参考以下文章