这是我的查询:
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 ...