2016-03-31 3 views
0

Учитывая следующую схему http://sqlfiddle.com/#!9/dbc328 У меня есть две таблицы:MySQL - подсчитывать элементы, имеющие записи в другой таблице (внутреннее соединение)

имена

id 
name 

и

адреса

id 
nameId 
address 

Мне нужно выяснить, сколько ресурсов в names имеет определенное количество адресов, например, 3 адреса.

Используя следующий запрос:

SELECT n.id 
FROM `names` n 
INNER JOIN `addresses` a on a.nameId = n.id 
group by n.id 
having count(a.id) = 3 

я могу узнать, какие являются теми именами, но мне нужно count().

При попытке использовать счета, такие как

SELECT count(n.id) as cnt 
FROM `names` n 
INNER JOIN `addresses` a on a.nameId = n.id 
group by n.id 
having count(a.id) = 3 

не работает, потому что я использую group by. Я знаю, что могу достичь этого, используя вложенные запросы, но я хочу знать, можно ли это сделать с помощью одного запроса.

EDIT: ожидаемый ответ должен состоять из одной строки, содержащей одно поле «cnt», которое должно возвращать число имен, имеющих по 3 адреса.

например. ответ должен быть 2 в этом случае, так как только те записи, которые соответствуют нашим критериям, 1 и 4

EDIT: Вот Вложенный запрос, который работает

select count(n.id) as cnt 
from `names` n 
where n.id IN (SELECT n.id 
FROM `names` n 
INNER JOIN `addresses` a on a.nameId = n.id 
group by n.id 
having count(a.id) = 3) 

Я хочу, чтобы достичь того же, без необходимости использовать вложенный запрос

Спасибо, Daniel

+1

, что ваш ожидаемый результат, как ре Ваша таблица? – Sadikhasan

+0

Ожидаемый ответ должен состоять из одной строки, содержащей одно поле «cnt», которое должно возвращать количество записей в таблице «names», каждая из которых имеет по 3 адреса. – Daniel

+0

Вы должны использовать свой запрос в качестве подзапроса и применять 'count' во внешнем запросе. –

ответ

0
SELECT COUNT(*) AS total 
FROM 
    (SELECT a.nameId 
    FROM `names` n 
    INNER JOIN `addresses` a ON a.nameId = n.id 
    GROUP BY n.id 
    HAVING count(a.id) = 3) AS TEMP 
+0

Мне нужен запрос, который возвращает одну строку с одним полем «cnt», которое содержит общее количество записей в таблице имен, имеющих по 3 адреса: , например. ответ должен быть «2» в этом случае, так как единственные записи, которые соответствуют нашим критериям: «1» и «4» – Daniel

+0

@ Даниэль Чек мой отредактированный ответ с демо – Sadikhasan

+0

Зачем вам нужно подсчитывать внутри? – sagi

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