2012-03-12 3 views
3

Допустим, у меня есть простая таблица голосования с колоннамиВЫБРАТЬ строки с минимальным COUNT (*)

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) 

Но она возвращается пустой set.If я заменить мин (счет) с фактической минимальной стоимости она работает должным образом. Я также попытался

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 

Но это привело только один ряд, у меня есть 3 строки с одинаковой кол мин, но с разной candidates.I хочет, чтобы вся эти 3 строки.

Может ли кто-нибудь помочь мне. Строки No.of с одинаковым значением подсчета (*) также помогут.

Образец довольно большой, поэтому я хочу показать некоторые фиктивные значения

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 

I хотите, чтобы отображались верхние 2 строки, т. е. со счетчиком (*) = 1 или что-то среднее.

+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; 
+0

Спасибо ... Я могу сделать это теперь с помощью переменной @min. (Я не знал, что мы можем создавать эти типы переменных, сохраняя несколько запросов в mysql) PS-Я не думаю, что есть необходимость использовать JOIN во втором ваш запрос, он не группируется по кандидатам – rockstarjindal

0

Удалите ключевое слово HAVING полностью, это неправильно написано.

и добавьте SUB SELECT в предложение where, чтобы он соответствовал этим критериям.

(то есть. Выберите псих, граф (*), как кол от голосования, где ранг = 1 и сосчитать = (выберите .....)

+0

Это показывает «подсчитывать Неизвестный столбец where where ", когда я использую SUB SELECT – rockstarjindal

0

HAVING Ключевое слово не может использовать функцию MIN так, как вы пытаюсь заменить функцию MIN с абсолютным значением, например, как HAVING count > 10

+0

Это то, чего я не хочу. Я не знаю абсолютного значения. Я знаю, что это минимум – rockstarjindal

+0

Минимум чего? Вы можете сначала получить это значение, а затем применить его к ключевому слову HAVING? – PFY

+0

минимальный счетчик (*) при сгруппировке по кандидату. Да, @Devart только что предложил то же самое. Я раньше не знал, как хранить переменные между запросами – rockstarjindal

Смежные вопросы