Как связать COUNT и INNER JOIN с полем объединенного значения в MySQL

У меня 2 стола

table A

tag_id | Tag_name

1      | tg1
2      | tg2
3      | tg3
4      | tg4

таблица B

id | name |tag_id

1  | avq    | 1,2,4
2  | bdq    | 2
3  | abc    | 3,2
4  | vdf    | 1,4
5  | zxc    | 3

я бы хотел внутреннее соединение обе таблицы и получить его подсчитывать с помощью tag_id в следующем формате

`tg1=> 2,tg2=> 3,tg3=> 2,tg4=> 2`

Как это возможно в одном MySQL запрос?

2

Решение

Наилучшим вариантом является нормализация 2-й таблицы и создание таблицы ассоциации для хранения идентификатора тега и идентификатора 2-й таблицы. В то же время следующее должно делать эту работу, но в долгосрочной перспективе вам необходимо нормализовать таблицу, иначе в будущем возникнет больше проблем.

select
t1.Tag_name, count(*) as total
from tableA t1
join tableB t2 on find_in_set(t1.tag_id,t2.tag_id) > 0
group by t1.tag_id ;
2

Другие решения

Вам нужно создать таблицу отношений. Например:

Tag table:
+----+----------+
| id | name     |
+----+----------+
| 1  | Tag name |
+----+----------+
| 2  | Tag 2    |
+----+----------+

B Table:
+----+-----------+
| id | title     |
+----+-----------+
| 1  | Any title |
+----+-----------+

Reference table ex. :

+------+--------+
| b_id | tag_id |
+------+--------+
| 1    | 1      |
+------+--------+
| 1    | 2      |
+------+--------+

В вашей справочной таблице вы положили много тегов для одного элемента B. В этом примере вы видите два тега, назначенных ссылкой на b_id = 1

0

select tag_name, count(position)
from (
select a.tag_name, FIND_IN_SET(a.tag_id,b.tag_id) as position
from a,b
) as tmpTB
where position !=0
group by tag_name
0