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


Limit the amount of results from mySQL conditionally?

这是我的查询:

SELECT * FROM Photos WHERE Event_ID IN ($eventidstring)

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

我需要$eventidstring中的Limit the amount of results Per值

因此,如果$eventidstring=23,41,23*

*有10个结果,其中Event_ID=23,我想将这个数量限制为5。$eventidstring中的所有其他值也是如此

您可能会很高兴在MySQL中做一些类似于Oracle的RANK by PARITION的事情。

遗憾的是,这个功能在MySQL中不可用,尽管你可以使用这个方法来解决它

在内联视图中转储它,然后选择秩为<=的行5.

因此:

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之后添加更多内容来决定这一点。

我认为您是在PHP中的某个地方编写查询的,所以您需要将$eventidstring拆分为它的组件值,为每个值形成SELECT,并在第一个值之后形成UNION。

您可以使用某种循环来完成此操作,并在循环中连接查询字符串。。。

如果我理解正确,并且你想得到每个中的五个,你可以使用这个:

(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)
...

也许使用SELECT UNION,但您需要为每个值进行新的选择:

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