MySQL выбрать, где строка больше единицы - PullRequest
0 голосов
/ 12 мая 2011

Я работаю над запросом, который объединяет несколько таблиц для детализации, чтобы получить число подписчиков, проголосовавших по регионам, где подписчики имеют более одного голоса.

Проблема, с которой я застрял, - это попытканапишите в запросе, чтобы вычислить, где подписчики проголосовали более чем за один.

SELECT COUNT(*), regions.name, 
(SELECT COUNT(*) FROM votes 
LEFT JOIN profiles on votes.subscriber_id = profiles.subscriber_id 
LEFT JOIN countries on profiles.country_id = countries.id 
WHERE countries.region_id = regions.id GROUP BY votes.subscriber_id) as vote_count 
FROM subscribers
LEFT JOIN profiles on subscribers.id = profiles.subscriber_id
LEFT JOIN countries on profiles.country_id = countries.id
LEFT JOIN regions on countries.region_id = regions.id 
LEFT JOIN votes on subscribers.id = votes.subscriber_id
WHERE subscribers.created_at < '2011-04-22 00:00:00'
GROUP BY regions.id
HAVING vote_count > 1;

С помощью вышеприведенного запроса я получаю ошибку: Subquery returns more than 1 row

Есть идеи?

Ответы [ 4 ]

1 голос
/ 12 мая 2011

Секция

SELECT COUNT(*) FROM votes 
LEFT JOIN profiles on votes.subscriber_id = profiles.subscriber_id 
LEFT JOIN countries on profiles.country_id = countries.id 
WHERE countries.region_id = regions.id GROUP BY votes.subscriber_id

возвращает более одного результата. Попробуйте удалить «GROUP BY voices.subscriber_id», который должен решить проблему

0 голосов
/ 12 мая 2011

Попробуйте вставить предложение HAVING vote_count > 1 в подзапрос.Кроме того, попробуйте подзапрос самостоятельно, чтобы увидеть, что он дает.

0 голосов
/ 12 мая 2011

Поскольку вы помещаете подзапрос в часть запроса SELECT, ожидается только одно возвращаемое значение (поскольку наборы результатов являются двумерными).

Вы должны добавить где-нибудь в предложении WHERE внутреннего запроса совпадение с внешним запросом, чтобы убедиться, что совпадает только одна строка.

Какой COUNT (*) вы ищете, который соответствует region.name? Вы должны подключить внутренний запрос к этому.

0 голосов
/ 12 мая 2011

если ваш подзапрос:

(SELECT COUNT(*) FROM votes 
LEFT JOIN profiles on votes.subscriber_id = profiles.subscriber_id 
LEFT JOIN countries on profiles.country_id = countries.id 
WHERE countries.region_id = regions.id GROUP BY votes.subscriber_id)

возвращает более 1 строки, то произойдет ошибка, поскольку он пытается поместить набор строк в значение vote_count.Вы можете решить эту проблему, гарантировав, что запрос имеет только 1 результат строки, добавив предложение HAVING.

...