这是我的问题:
SELECT * FROM Photos WHERE Event_ID IN ($eventidstring)
我知道我可以使用LIMIT 5限制此查询的总结果数
我需要限制$ eventidstring中每个值的结果量。
所以如果$ eventidstring = 23,41,23 *
* 并且有10个结果WHERE Event_ID = 23,我想将此数量限制为5.对于$ eventidstring中的所有其他值也是如此。
答案 0 :(得分:3)
您可能会喜欢在MySQL中使用PARITION类似于Oracle的RANK。
遗憾的是,虽然您可以使用this method
解决此问题,但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
之后添加更多内容以确定此内容。
答案 1 :(得分:1)
我认为你在PHP中的某个地方写了那个查询,所以你需要将$eventidstring
分成它的组件值,在第一个之后形成一个SELECT和UNION。
你可以用某种循环来做这件事,并在循环中连接查询字符串......
答案 2 :(得分:0)
如果我理解正确并且你想要每个五个,你可以使用它:
(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)
...
答案 3 :(得分:0)
可能使用SELECT UNION,但您需要为每个值选择一个新选项:
SELECT * FROM Photos WHERE Event_ID = 23 LIMIT 5
UNION SELECT * FROM Photos WHERE Event_ID = 41 LIMIT 5
UNION SELECT ...