Подсчет и группировка столбцов с несколькими соединениями

#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 with count(*) )

  • Я бы рекомендовал группировать по первичному ключу 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 . В то же время мне также нужны эти уникальные записи.