MYSQL - немного проблем / путаницы с запросом на соединение - PullRequest
0 голосов
/ 07 ноября 2011

Я пытаюсь собрать запрос MySQL, который связывает 3 таблицы вместе. По сути, таблицы таковы:

  1. продукты - содержит информацию о продукте и основные цены.
  2. product_depts - таблица привязки продуктов к различным отделам.
  3. акции - Другая таблица ссылок, ссылки на периоды продвижения и цены на основе идентификатора продукта.

Это запрос:

SELECT p.id, `desc` , price1, price2, cost1, taxable, quantity, deptId, sale
FROM products p
INNER JOIN product_depts ON p.id = prodId
INNER JOIN promotions s ON p.id = s.id
WHERE MATCH (
`desc`
)
AGAINST (
'CLOVER'
IN BOOLEAN
MODE
)
ORDER BY `desc`
LIMIT 0 , 30

Если убрана следующая строка:

INNER JOIN promotions s ON p.id = s.id

И sale извлечены из предложения select,

Что происходит, возвращаются ли ВСЕ продукты с описанием, содержащим "CLOVER", в таблице продуктов.

При добавлении удаленных частей запроса возвращаются только те элементы, которые находятся в продвижении (с соответствующим идентификатором в таблице продвижений). И любые дополнительные продукты, содержащие "CLOVER" в таблице products, которые не находятся "в продвижении", не учитываются.

Поскольку у меня очень ограниченные знания в области mysql, я подумал, что, возможно, кто-то, у кого есть обширные знания по этому вопросу, хотел бы поделиться ...

Хотя, насколько я понимаю, это по сути то же самое, что и вызов deptId из таблицы product_depts, который работает отлично. Так что это меня смущает.

Что я делаю не так, что отображаются только те элементы, которые «продвигаются», а дополнительные результаты не отображаются?

Спасибо!

1 Ответ

2 голосов
/ 07 ноября 2011

INNER объединяет, в основном, «извлекать все записи, в которых есть соответствующие записи в ОБАХ таблицах».

Если я правильно читаю ваш вопрос, это звучит так, как будто вам нужно соединение ВЛЕВО или ВПРАВО, что означает «получить все записи из одной таблицы и (если есть) соответствующие записи из другой таблицы.

Звучит так, будто вы хотите получить все продукты, независимо от того, имеют ли они рекламную акцию или нет, но если у них есть рекламная кампания, также получите информацию о рекламной акции.

Это было бы

SELECT ...
FROM products
INNER JOIN product_depts ON ...
LEFT JOIN promotions ON ...

Итак ... все продукты ДОЛЖНЫ иметь отдел, поэтому выполняйте внутреннее объединение для этой конкретной части запроса. Левое объединение в рекламных акциях делает таблицу «products» таблицей LEFT, поэтому все записи из этой таблицы выбираются. Таблица рекламных акций становится ПРАВЫЙ таблицей и предоставляет данные для результатов запроса только в том случае, если в таблице рекламных предложений есть соответствующая запись.

Итак ... учитывая 2 продукта, 1 из которых продается, вы получите

   product #1    department #1   promoinfo #1
   product #2    department #2   NULL

для результатов. Поскольку для рекламного продукта № 2 нет соответствующей промо-информации, вы получаете NULL для промо-данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...