Фильтровать данные на основе конкретных данных столбца в MySQL - PullRequest
0 голосов
/ 23 декабря 2019

В моей базе данных есть следующие таблицы.

Таблица: actor_action

actor_id | time | monday_action_id | tuesday_action_id | .... | friday_action_id
1           1       2                   1                       3
1           2       3                   4                       1
2           1       1                   5                       4

Таблица: action

action_id | action_name | action_type | action_group_name
1               A1          single          -
2               X2          multiple        X_GROUP
3               B1          single          -
4               X1          multiple        X_GROUP
5               Y1          multiple        Y_GROUP

Я хочу запросить следующую информацию для данного actor_id(например: actor_id = 1). Здесь, как вы можете видеть, я хочу выбрать action_group_name вместо action_name, если action_type равно " кратно ".

Ожидаемый результат: -

actor_id | time | monday_name | tuesday_name | .... | friday_name
1           1       X_GROUP     A1                      B1
1           2       B1          X_GROUP                 A1

В настоящее время у меня есть следующий запрос, который выбирает только имя действия.

SELECT a1.action_name AS monday_name,
       a2.action_name AS tuesday_name,
       a3.action_name AS wednesday_name,
       a4.action_name AS thursday_name,
       a5.action_name AS friday_name,
       act.time AS time
FROM actor_action act
LEFT JOIN action a1 ON ct.monday_action_id=a1.action_id 
LEFT JOIN action a2 ON ct.tuesday_action_id=a2.action_id 
LEFT JOIN action a3 ON ct.wednesday_action_id=a3.action_id 
LEFT JOIN action a4 ON ct.thursday_action_id=a4.action_id 
LEFT JOIN action a5 ON ct.friday_action_id=a5.action_id 
WHERE act.actor_id = ?

Как мне написать запрос, который выполняет фильтрацию, как я упоминал выше.

1 Ответ

2 голосов
/ 23 декабря 2019

Вам просто нужно заменить каждый отдельный выбранный столбец, например,

a1.action_name AS monday_name

соответствующим выражением CASE:

CASE WHEN a1.action_type = 'multiple' THEN a1.action_group_name
     ELSE a1.action_name
END AS monday_name

Вывод (на основе данных выборки)

monday_name     tuesday_name    friday_name     time
X_GROUP         A1              B1              1
B1              X_GROUP         A1              2

Демонстрация на dbfiddle

Обратите внимание, что на основе псевдонимов таблиц в вашем запросе псевдоним таблицы для этого столбца должен быть a1, а не s1.

...