MySQL отношения многие ко многим, как столбцы - PullRequest
0 голосов
/ 17 мая 2018

У меня следующая структура:

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 голосов
/ 18 мая 2018

у меня получилось:

SELECT 
    case.id,
    sum(IF(csb.behaviour_id = 1, true, false)) as `behaviour_1`,
    sum(IF(csb.behaviour_id = 2, true, false)) as `behaviour_2`,
    sum(IF(csb.behaviour_id = 3, true, false)) as `behaviour_3`,
    sum(IF(csb.behaviour_id = 4, true, false)) as `behaviour_4`,
    sum(IF(csb.behaviour_id = 5, true, false)) as `behaviour_5`,
    sum(IF(csb.behaviour_id = 6, true, false)) as `behaviour_6`,
    sum(IF(csb.behaviour_id = 7, true, false)) as `behaviour_7`,
    sum(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; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...