想象一下,我根据评级对行进行排序,我只想根据暴露的行总量(一定时不时变化,因此应该在路上计算)来确定一定量。 。这是显示每一行的子查询,以及我试图使用的令人毛骨悚然的技巧但没有成功:
SELECT (
SELECT
p.post_id,
AVG(r.numeric_rate) as numeric_rate
FROM
post p
LEFT JOIN rating r
ON p.post_id = r.post_id
WHERE
r.enabled > 0
GROUP BY p.post_id
ORDER BY numeric_rate DESC
)
LIMIT CEIL(0.10 * COUNT(*))
MySQL因为这么多而责备我,我有点尴尬。我总是按照PHP的方式完成这个步骤,通过获取行数并在取出后停止,但我想这样做并且#34;好的方式",期待一个响应时间快一点。你能帮我解决这个问题吗?
PS:由于某些隐私政策,我无法向您显示字段/表格的真实姓名,因此可能会出现一些拼写错误(但我希望不会)
答案 0 :(得分:1)
您必须使用2个查询:
SELECT
CEIL(0.10 * COUNT(DISTINCT post_id)) as limit
FROM post
使用限制:
SELECT
p.post_id,
AVG(r.numeric_rate) as numeric_rate
FROM
post p
LEFT JOIN rating r
ON p.post_id = r.post_id
WHERE
r.enabled > 0
GROUP BY p.post_id
ORDER BY numeric_rate DESC
LIMIT :limit
答案 1 :(得分:1)
实际上,这不是解决问题的最佳方式,但解决方法很有趣:)
set @total := CEIL(0.1 * (
SELECT
count(distinct(post_id))
FROM
post p JOIN rating r ON p.post_id = r.post_id
WHERE
r.enabled > 0));
set @i := 0;
SELECT
*,
@i:=@i+1
FROM
(
SELECT p.post_id, AVG(r.numeric_rate) as numeric_rate
FROM
post p JOIN rating r ON p.post_id = r.post_id
WHERE
r.enabled > 0
GROUP BY
p.post_id
ORDER BY
numeric_rate DESC
) as tmp
WHERE
@i<@total
答案 2 :(得分:1)
您必须使用两个查询。一个用于查找百分比,另一个用于获取行。
SET @percent = 0.1; -- You cant put here your percent
SELECT round(COUNT(1) * @percent) into @limit
FROM (
SELECT p.post_id, avg(r.numeric_rate)
FROM post p
LEFT JOIN rating r ON p.post_id = r.post_id
GROUP BY p.post_id
) as tmp;
SELECT q.post_id, q.rate FROM (
SELECT p.post_id, avg(r.numeric_rate) rate, @row := @row + 1 AS rank
FROM post p
LEFT JOIN rating r ON p.post_id = r.post_id,
(SELECT @row := 0) row
GROUP BY p.post_id
ORDER BY 2 DESC
) q WHERE q.rank <= @limit;
我确信可能会有更高效的解决方案,但我希望这个解决方案对您有用。