Внутреннее соединение MySQL без строк

0

У меня есть база данных 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 поле истинно?

  • 0
    Ваше обязательное поле, какие это данные?
  • 0
    @RadamesE.HernandezD.L.R.RadamesE.HernandezD.LR - я настроил его как логическое поле в phpMyAdmin, но тип данных автоматически изменился на tinyint (1).
Показать ещё 2 комментария
Теги:

2 ответа

0
Лучший ответ

Я смог решить свою проблему, выполнив СОЮЗ как таковой:

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
0

Как насчет использования условия ИЛИ вместо 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;
  • 0
    Прочтите абзац второй до последнего о том, почему это не сработает.
  • 0
    ?? ты пробовал это? Во втором и последнем параграфе говорится об удалении оператора JOIN и выражения business_id из предложения where, тогда как я предлагаю вам оставить их обоих на месте, заменив «И» на «ИЛИ» в предложении «где».
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню