mysql多对多关系作为列

时间:2018-05-17 03:45:26

标签: mysql many-to-many

我有以下结构:

case:
id int
...

behaviours:
id int,
label varchar

case_to_behaviour:
case_id,
behaviour_id

“行为”是一个集合列表,不会被用户动态添加,编辑或删除。

我需要报告一些像这样的多对多关系,但是正确使用这个关系会给我一个模板来与其他人合作。

到目前为止,因为只有8种列出的行为'我有以下查询,它让我得到我想要的,我希望也许有一个更好或更有效的方式来查询。

数据必须如下:

id | behaviour_1 | behaviour_2 | behaviour_3 | behaviour_4 | behaviour_5 ....
----------------------------------------------------------------------------
1  | true        | true        | false       | false       | true

我目前用来获取他的脚本如下,但最多只能处理9个项目。

SELECT 
    case.id,
    IF(csb.behaviours like '%1%', true, false) as `behaviour_1`,
    IF(csb.behaviours like '%2%', true, false) as `behaviour_2`,
    IF(csb.behaviours like '%3%', true, false) as `behaviour_3`,
    IF(csb.behaviours like '%4%', true, false) as `behaviour_4`,
    IF(csb.behaviours like '%5%', true, false) as `behaviour_5`,
    IF(csb.behaviours like '%6%', true, false) as `behaviour_6`,
    IF(csb.behaviours like '%7%', true, false) as `behaviour_7`,
    IF(csb.behaviours like '%8%', true, false) as `behaviour_8`

from case c
left join 
    (select group_concat(behaviour_id) as behaviours, case_id  from case_to_behavior group by case_id) csb on csb.case_id=c.id
group by c.id;

编辑: 我尝试过类似的查询,如下面的演示,它是如何只适用于第一次连接,这是有道理的。我只是不知道如何以我想要的格式获取数据。

SELECT 
    case.id,
    IF(csb.behaviour_id = 1, true, false) as `behaviour_1`,
    IF(csb.behaviour_id = 2, true, false) as `behaviour_2`,
    IF(csb.behaviour_id = 3, true, false) as `behaviour_3`,
    IF(csb.behaviour_id = 4, true, false) as `behaviour_4`,
    IF(csb.behaviour_id = 5, true, false) as `behaviour_5`,
    IF(csb.behaviour_id = 6, true, false) as `behaviour_6`,
    IF(csb.behaviour_id = 7, true, false) as `behaviour_7`,
    IF(csb.behaviour_id = 8, true, false) as `behaviour_8`,
from case c
left join case_to_behavior csb on csb.case_id=c.id
group by c.id; 

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题:

pip install geocoder