How to get COUNT and INNER JOIN related with concated value field in mysql

时间:2015-10-06 08:17:34

标签: php mysql count inner-join concat

I have 2 tables

table A

tag_id | Tag_name

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

table B

id | name |tag_id

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

I want to inner join both tables and get its count using tag_id in the following format

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

How is it possible in a single MySQL query?

3 个答案:

答案 0 :(得分:2)

The best option is to normalize the 2nd table and create an association table for storing the tag id and the id of the 2nd table. In the meanwhile the following should do the job but for long run you need to normalize the table else more problems will happen in future

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 ;

答案 1 :(得分:0)

You need to create relation table. For example:

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      |
+------+--------+

In your reference table you put many tags for one B element. In this example you see two tags assigned by reference to b_id = 1

答案 2 :(得分: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