MySQL объединяется и COUNT (*) из другой таблицы - PullRequest
33 голосов
/ 31 января 2011

У меня есть две таблицы: groups и group_members.

Таблица groups содержит всю информацию для каждой группы, такую ​​как ее идентификатор, название, описание и т. Д.

В таблице group_members перечислены все члены, которые являются членами каждой группы, например:

group_id | user_id
1 | 100
2 | 23
2 | 100
9 | 601

По сути, я хочу перечислить ТРИ группы на странице, и я хочу только перечислить группы, в которых более четырех членов. Внутри цикла <?php while ?> я хочу, чтобы четыре члена были членами этой группы. У меня нет проблем с перечислением групп и перечислением участников в другом внутреннем цикле, я просто не могу уточнить группы так, чтобы показывались ТОЛЬКО те, у кого более 4 участников.

Кто-нибудь знает, как это сделать? Я уверен, что это с присоединениями MySQL.

Ответы [ 4 ]

68 голосов
/ 31 января 2011

MySQL использует для этих задач оператор HAVING .

Ваш запрос будет выглядеть так:

SELECT g.group_id, COUNT(m.member_id) AS members
FROM groups AS g
LEFT JOIN group_members AS m USING(group_id)
GROUP BY g.group_id
HAVING members > 4

пример, когда ссылки имеют разные имена

SELECT g.id, COUNT(m.member_id) AS members
FROM groups AS g
LEFT JOIN group_members AS m ON g.id = m.group_id
GROUP BY g.id
HAVING members > 4

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

38 голосов
/ 24 января 2014
SELECT DISTINCT groups.id, 
       (SELECT COUNT(*) FROM group_members
        WHERE member_id = groups.id) AS memberCount
FROM groups
1 голос
/ 31 января 2011

Ваша таблица groups_main имеет ключевой столбец с именем id. Я полагаю, что вы можете использовать синтаксис USING для объединения только в том случае, если в таблице groups_fans есть ключевой столбец с тем же именем, которого, вероятно, нет. Вместо этого попробуйте это:

LEFT JOIN groups_fans AS m ON m.group_id = g.id

Или замените group_id именем соответствующего столбца в таблице groups_fans.

0 голосов
/ 10 ноября 2017

Может быть, я здесь не в курсе и не понимаю ОП, но почему вы присоединяетесь к столам?

Если у вас есть таблица с членами, а в этой таблице есть столбец с именем «group_id», вы можете просто выполнить запрос к таблице членов, чтобы получить количество членов, сгруппированных по group_id.

SELECT group_id, COUNT(*) as membercount 
FROM members 
GROUP BY group_id 
HAVING membercount > 4

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

Если вам нужны сведения о группе, описание и т. Д., То добавление объединения из таблицы участников обратно в таблицу групп для получения имени даст вам самый быстрый результат.

...