【问题标题】:Limit the amount of results from mySQL conditionally?有条件地限制来自 mySQL 的结果数量?
【发布时间】: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 语句。

标签: php mysql


【解决方案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 ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      • 2015-06-04
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      相关资源
      最近更新 更多