SELECT `name` , COUNT(*) AS `count` FROM `t1`, `t2` WHERE `t2`.`id` = `t1`.`id` GROUP BY `t2`.`id`
Я хочу получить имя из t1 и количество строк в t2, где идентификатор такой же, как в t1.
У меня есть указанное выше, однако он не вернет никаких данных, если в t2 нет соответствующих строк. Я бы предпочел, чтобы count был равен 0 (или NULL), если строк нет, а имя все равно возвращается.
Редактировать: Я бы хотел иметь возможность сортировки по убыванию count. (или name ASC) такое возможно?


Сделайте союз, чтобы получить другой набор
SELECT `name` , COUNT(*) AS `count`
FROM `t1`, `t2`
WHERE `t2`.`id` = `t1`.`id`
GROUP BY `t2`.`id`
UNION
Select name, 0 as count
from t1
where NOT EXISTS (select 1 from t2 where `t2`.`id` = `t1`.`id`)
Это должно сработать для вас:
SELECT `t1`.`id` , COUNT(`t2`.`id`) AS `count`
FROM `t1` LEFT JOIN `t2` ON `t1`.`id` = `t2`.`id`
GROUP BY `t1`.`id`
Левое соединение гарантирует, что у вас есть все строки из t1, а COUNT (t2.id) заставляет подсчитывать только записи, где t2.id не равно нулю (то есть - те, которые действительно существуют в t2)
Спасибо за вашу помощь. Хотелось бы иметь возможность сортировки по убыванию count. (или name ASC) такое возможно?
Хм ... ваше решение показывает '1' для count, если теперь в t2 есть строки
просто добавьте в конце "Сортировать по убыванию"
Стив: если он показывает 1 - может быть, вы просто поставили COUNT (t1.id), а не COUNT (t2.id)? это имеет огромное значение ...
Сортировка по убыванию по COUNT и по возрастанию в пределах того же количества по name. Имена без строк в t2 вернутся со счетом 0.
SELECT
`t1`.`name`,
COUNT(`t2`.`id`) AS `count`
FROM
`t1`
LEFT JOIN `t2` ON`t2`.`id` = `t1`.`id`
GROUP BY
`t1`.`name`
ORDER BY
COUNT(`t2`.`id`) DESC,
`t1`.`name`
Измените ORDER BY в соответствии с вашими потребностями.
Ура, однако count отображает 1, когда в t2 нет строк
Спасибо за вашу помощь. Это самый эффективный / элегантный способ? Есть ли способ сделать это с помощью JOINs?