У меня есть база данных MySQL, которую я нормализовал, и идея состоит в том, чтобы позволить бизнесу выбирать нулевые или более маркетинговые последовательности, но кикер состоит в том, что требуется несколько маркетинговых последовательностей (сейчас у меня 4, но список может расти), Итак, что я сделал, структурированы мои таблицы как таковые:
sequence
+-------------+------------------+-------+-------------+----------+
| sequence_id | customer_type_id | title | description | required |
| 1 | 1 | ... | ... | true |
| 2 | 1 | ... | ... | true |
| 3 | 1 | ... | ... | false |
| 4 | 2 | ... | ... | true |
| 5 | 3 | ... | ... | true |
| 6 | 4 | ... | ... | false |
+-------------+------------------+-------+-------------+----------+
business_sequence
+----------------------+-------------+-------------+
| business_sequence_id | business_id | sequence_id |
+----------------------+-------------+-------------+
customer_type_id
и business_id
- это поля внешнего ключа, которые ссылаются на таблицы, описывающие тип клиента (клиента, бывшего клиента и т.д.) и бизнес-информацию (имя, адрес и т.д.) соответственно.
Причина, по которой у меня есть required
столбец в моей таблице последовательности, заключается в том, что если бизнес решает не разрешать какие-либо необязательные последовательности, то этому бизнесу не потребуется строка. В конце концов, нет необходимости иметь повторяющиеся строки в таблице business_sequence, если только отдельный фрагмент данных является полем business_id
.
Теперь то, что я пытаюсь сделать, это получить все строки и все поля из таблицы последовательностей, где business_id в таблице business_sequence соответствует параметризованному значению (например, 1 для примера, который я собираюсь показать за секунду). Запрос, который я пытался использовать:
SELECT
s.*
FROM
'sequence' AS s
INNER JOIN 'business_sequence' AS b ON b.'sequence_id' = s.'sequence_id'
WHERE
b.'business_id' = 1 AND
s.'required' = true;
Но это не привело к результатам, если в таблице последовательности не было строк. То, что я ожидал от него, это вернуть 0 строк из b.business_id = 1
но я также ожидал, что он вернет 4 "требуемые" строки (ids: 1, 2, 4 и 5) из s.required = true
,
Всякий раз, когда я извлекал оператор INNER JOIN и часть business_id предложения WHERE, он фактически возвращает 4 "требуемые" строки. Это приводит меня к мысли, что в моем исходном запросе, поскольку в таблице sequence
нет строк для этого конкретного бизнес- sequence
он ничего не возвращает.
Со всем этим сказанным, как я могу выполнить получение нулевой или более строк, когда поле business_id
соответствует параметризованному значению и извлекает все строки, когда required
поле истинно?
Я смог решить свою проблему, выполнив СОЮЗ как таковой:
SELECT * FROM 'sequence' WHERE 'required' = true
UNION
SELECT
s.*
FROM
'sequence' AS s
INNER JOIN 'business_sequence' AS b ON b.'sequence_id' = s.'sequence_id'
WHERE
b.'business_id' = 1
Как насчет использования условия ИЛИ вместо AND?
SELECT
s.*
FROM
'sequence' AS s
INNER JOIN 'business_sequence' AS b ON b.'sequence_id' = s.'sequence_id'
WHERE
b.'business_id' = 1 OR
s.'required' = true;