SELECT行数最少(*)

时间:2012-03-12 17:14:21

标签: mysql

假设我有一个简单的表投票列

id(primaryKey),token(int),candidate(int),rank(int).

我想提取具有特定等级的所有行,按候选分组,最重要的是仅用最小计数(*)。 到目前为止,我已经到达

SELECT candidate, count( * ) AS count
FROM voting
WHERE rank =1
AND candidate <200
GROUP BY candidate
HAVING count = min( count )

但是,它返回空集。如果我将min(count)替换为实际最小值,它可以正常工作。 我也试过

SELECT candidate,min(count)
FROM (SELECT candidate,count(*) AS count
      FROM voting
      where rank = 1
      AND candidate < 200
      group by candidate
      order by count(*)
      ) AS temp

但这导致只有1行,我有3行具有相同的最小计数但具有不同的候选者。我想要所有这3行。

任何人都可以帮助我。具有相同最小计数(*)值的行数也会有所帮助。

示例相当大,所以我显示了一些虚拟值

1 $sampleToken1 101 1

2 $sampleToken2 102 1

3 $sampleToken3 103 1

4 $sampleToken4 102 1

这里,当根据候选分组时,有3行与count(*)结果组合

candidate count( * )

101              1

103              1

102              2

我希望显示前2行,即count(*)= 1或其他最小值

3 个答案:

答案 0 :(得分:1)

尝试将此脚本用作模式 -

-- find minimum count
SELECT MIN(cnt) INTO @min FROM (SELECT COUNT(*) cnt FROM voting GROUP BY candidate) t;

-- show records with minimum count
SELECT * FROM voting t1
  JOIN (SELECT id FROM voting GROUP BY candidate HAVING COUNT(*) = @min) t2
    ON t1.candidate = t2.candidate;

答案 1 :(得分:0)

完全删除您的HAVING关键字,但未正确编写。

并将SUB SELECT添加到where子句中以符合该条件。

(即选择cand,count(*)作为投票计数,其中rank = 1且count =(select .....)

答案 2 :(得分:0)

HAVING关键字无法以您尝试的方式使用MIN功能。将MIN函数替换为绝对值,例如HAVING count > 10