仅提取行的第一个“百分比”

时间:2014-05-09 08:33:39

标签: mysql

想象一下,我根据评级对行进行排序,我只想根据暴露的行总量(一定时不时变化,因此应该在路上计算)来确定一定量。 。这是显示每一行的子查询,以及我试图使用的令人毛骨悚然的技巧但没有成功:

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:由于某些隐私政策,我无法向您显示字段/表格的真实姓名,因此可能会出现一些拼写错误(但我希望不会)

3 个答案:

答案 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;

我确信可能会有更高效的解决方案,但我希望这个解决方案对您有用。

相关问题