#mysql #sql #join #count #left-join
#mysql #sql #Присоединиться #подсчет #левое соединение
Вопрос:
У меня есть 3 таблицы:
Table A
----------------------------
id | data
----------------------------
1 nothing important
2 nothing important
3 nothing important
Table B
-----------------------------------------
id | table_a_id | table_c_id
-----------------------------------------
1 1 1
2 1 2
3 1 3
Table C
----------------------------
id | name
----------------------------
1 Bob Saget
2 Neil deGrasse Tyson
3 Mike Tyson
Таблицы B и C имеют отношение 1: 1, тогда как таблица A и таблица B имеют отношение «один ко многим».
Я хочу получить количество JOIN
отредактированных строк Table B
.
Вот моя попытка, которая не работает:
SELECT count(*) AS count, tC.name FROM table_a tA
LEFT JOIN table_b tB ON tA.id = tB.table_a_id
LEFT JOIN table_c tC ON tC.id = tB.table_c_id
GROUP BY tA.id, tC.name
Я надеюсь, что результат будет выглядеть так:
Result
----------------------------
count | name
----------------------------
3 Bob Saget
3 Neil deGrasse Tyson
3 Mike Tyson
Количество представляет количество строк, из которых были JOIN
удалены Table B
. В этом случае 3 строки из таблицы B содержат внешний ключ для таблицы A.
Использование может использовать эту скрипку.
Комментарии:
1. Вы используете только внутренние соединения, поэтому в результирующий набор всегда помещается только запись с идентификатором 1 из таблицы a. Количество (1) соединенных строк imO верно, я не понимаю ваших ожиданий.
2. @aschoerk я обновил свои ожидания и включил скрипку.
3. Обычно вы ГРУППИРУЕТЕСЬ ПО тем же столбцам, которые вы ВЫБИРАЕТЕ, за исключением тех, которые являются аргументами для установки функций. Т.е. Попробуйте GROUP BY tC.name .
Ответ №1:
Если вы хотите подсчитать, сколько строк в a
относится к каждому c
, то c
оно должно быть первым в from
предложении, за которым следуют left join
s для других таблиц.
Кроме того, вам нужно a.id
из group by
предложения — в противном случае вы, вероятно, получите только одну (или нулевую) строку на группу.
Другие вещи, которые следует учитывать:
-
вы
left join
редактируете, поэтому вам следует считать что-то изa
, а не простоcount(*)
, поэтому вы получаете0
для несопоставимых строк (вместо1
withcount(*)
) -
Я бы рекомендовал группировать по первичному ключу
c
, а не поname
, на случай, если два разныхid
s могут иметь одинаковыеname
Итак:
SELECT count(a.id) AS count, c.name
FROM table_c c
LEFT JOIN table_b b ON c.id = b.table_c_id
LEFT JOIN table_a a ON a.id = b.table_a_id
GROUP BY c.id
Комментарии:
1. Я внес эти изменения, но количество по
a.id
-прежнему равно 1.2. @user0000001: моя ошибка, я забыл исправить порядок таблиц в
from
предложении. Готово.3. Я все еще получаю 1 для подсчета. Посмотрите на эту скрипку .
4. @user0000001: теперь я не понимаю, зачем вам нужен
3
результирующий набор. На данный момент в каждой строкеc
есть только одно совпадениеa
. Вы ищете общее количество совпадений (что означает, что все строки всегда будут иметь одинаковое количество — здесь3
)?5. Это правильно. Я пытаюсь получить количество уникальных записей, в
table_b
которых содержится внешний ключtable_a
. В то же время мне также нужны эти уникальные записи.