Счетчик кросс-таблиц MySQL (*) Справка по запросу

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) такое возможно?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
0
1 687
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Сделайте союз, чтобы получить другой набор

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`)

Спасибо за вашу помощь. Это самый эффективный / элегантный способ? Есть ли способ сделать это с помощью JOINs?

Steve 06.11.2008 12:58
Ответ принят как подходящий

Это должно сработать для вас:

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) такое возможно?

Steve 06.11.2008 13:09

Хм ... ваше решение показывает '1' для count, если теперь в t2 есть строки

Steve 06.11.2008 13:19

просто добавьте в конце "Сортировать по убыванию"

Dheer 06.11.2008 13:19

Стив: если он показывает 1 - может быть, вы просто поставили COUNT (t1.id), а не COUNT (t2.id)? это имеет огромное значение ...

Incidently 06.11.2008 13:26

Сортировка по убыванию по 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 нет строк

Steve 06.11.2008 13:21

Другие вопросы по теме