Как написать оператор SQL для получения соответствующих данных из таблицы перекрестных ссылок? - PullRequest
0 голосов
/ 07 января 2019

У меня следующий запрос SQL (база данных MYSQL):

SELECT images.alt, images.product_id, images.src
FROM wp_wps_images images
INNER JOIN wp_wps_products products
ON products.product_id = images.product_id
AND products.product_id IN ("2112055640177","2112056590449","2112055378033","2112062292081","2112058490993","2112062619761","2112062488689","2112066420849","2112061833329","2112052527217")
WHERE images.alt LIKE "%Swatch%"

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

Rust (W) - Swatch   2112058490993   foobar.com
Sand - Swatch   2112058490993   barfoo.com
Tan - Swatch    2112056590449   bazfoo.com
Generic Black - Swatch  2112056590449   tazfoo.com
Patterned / Multi - Swatch  2112055640177   mazfoo.com
Tan - Swatch    2112055640177   bazfoo.com
Generic Black - Swatch  2112055640177   tazfoo.com
Generic Black - Swatch  2112055378033   tazfoo.com
Dark Tobacco - Swatch   2112055378033   makazfoo.com

У меня есть tags таблица, схема которой выглядит следующим образом id (BIGINT), tag_id (BIGINT), product_id (BIGINT), post_id (BIGINT), tag (VARCHAR). Я хотел бы присоединиться к этой таблице, чтобы для выбранных изображений я также мог прочитать их соответствующее tag имя из таблицы тегов, но я не знаю, как написать правильное JOIN для достижения этой цели:

SELECT images.alt, images.product_id, images.src, tags.tag

Я надеюсь, что приведенное выше выражение вернет что-то вроде:

Rust (W) - Swatch   2112058490993   foobar.com           color:rust
Sand - Swatch   2112058490993   barfoo.com               material:sand
Tan - Swatch    2112056590449   bazfoo.com               color:tan
Generic Black - Swatch  2112056590449   tazfoo.com       color:black
Patterned / Multi - Swatch  2112055640177   mazfoo.com   material:multi
Tan - Swatch    2112055640177   bazfoo.com               color:tan
Generic Black - Swatch  2112055640177   tazfoo.com       color:black
Generic Black - Swatch  2112055378033   tazfoo.com       color:black
Dark Tobacco - Swatch   2112055378033   makazfoo.com     color:dark-tobacco

Сейчас у меня есть что-то вроде следующего оператора SQL, и оно не приближает меня к моей цели:

SELECT images.alt, images.product_id, images.src, tags.tag
FROM wp_wps_images images
INNER JOIN wp_wps_products products
ON products.product_id = images.product_id
AND products.product_id IN ("2112055640177","2112056590449","2112055378033","2112062292081","2112058490993","2112062619761","2112062488689","2112066420849","2112061833329","2112052527217")
INNER JOIN wp_wps_tags tags
ON tags.product_id = products.product_id
AND tags.product_id = images.product_id
AND tags.tag LIKE "%:%"
WHERE images.alt LIKE "%Swatch%"

Вышеприведенное утверждение дает мне результаты, в которых много дублирования, и это далеко от моей цели сопоставить изображения с их именем тега. Результаты:

Tan - Swatch    2112052527217   bazfoo.com  color:generic-black
Tan - Swatch    2112052527217   bazfoo.com  depth:8
Tan - Swatch    2112052527217   bazfoo.com  height:13
Tan - Swatch    2112052527217   bazfoo.com  material:leather
Tan - Swatch    2112052527217   bazfoo.com  strap:12-1-2
Tan - Swatch    2112052527217   bazfoo.com  style:totes
Tan - Swatch    2112052527217   bazfoo.com  width:19
Generic Black - Swatch  2112052527217   tazfoo.com  color:generic-black
Generic Black - Swatch  2112052527217   tazfoo.com  depth:8

Как написать оператор SQL для базы данных MYSQL, который возвращает изображения с соответствующим именем тега?

РЕДАКТИРОВАТЬ 1:

@ Дай оставил правильный комментарий ниже.

Ваш пример вывода данных не показывает, как вы хотите получать данные, когда один продукт имеет несколько тегов

Для одного продукта, имеющего несколько тегов, я хочу, чтобы теги соответствовали только строке данных строки images.alt. Альтернативные данные соответствуют следующей схеме: [color || material] - Swatch. Данные тегов следуют следующей строковой схеме: [type]:[value].

Сравнение строк должно соответствовать части [color || material] данных image.alt и правой стороне двоеточия, стороне [value], для данных tags.tag.

1 Ответ

0 голосов
/ 07 января 2019

Вы на правильном пути - два внутренних соединения.

Q: Что происходит с этим запросом:

SELECT images.alt, images.product_id, images.src, tags.tag
FROM wp_wps_images images
INNER JOIN wp_wps_products products
ON products.product_id = images.product_id
INNER JOIN wp_wps_tags tags
ON tags.product_id = images.product_id
WHERE images.alt LIKE "%Swatch%"
AND images.product_id IN ("2112055640177","2112056590449","2112055378033","2112062292081","2112058490993","2112062619761","2112062488689","2112066420849","2112061833329","2112052527217")

Другими словами:

1) Присоединяйтесь исключительно по взаимным ключам, затем

2) Фильтр по общим критериям

Для наборов данных в ваших таблицах:

Q: Вы все еще получаете "дублирующиеся строки"?

В: Есть ли ожидаемые строки "пропущены"?

В: Что произойдет, если / когда в одном продукте будет несколько строк?

Пожалуйста, попробуйте этот запрос и обновите ваше сообщение с результатами.

ТАКЖЕ: Смотрите здесь для большего количества предложений:

SQL Inner-join с 3 таблицами?

SQL INNER JOIN - запрос данных из двух или более таблиц


  1. Я внес еще одно изменение: я использую "images.product_id" по всем направлениям.

  2. Он должен возвращать текст «alt», идентификатор продукта, источник изображения и тег для каждого изображения, которое LIKE "%Swatch%" и IN ("2112055640177","2112056590449","2112055378033","2112062292081","2112058490993","2112062619761","2112062488689","2112066420849","2112061833329","2112052527217").

  3. Если вы получаете несколько строк ... это означает, что у вас есть дубликаты изображений.

  4. Если тег имеет нулевое значение, это означает, что тега для этого идентификатора продукта нет.

  5. Если вы не видите ожидаемый тег, это означает, что нет изображения, соответствующего предложению WHERE.

  6. Вы можете проверить любой из 3, 4 или 5, скопировав / вставив простой «ВЫБОР».

Надеюсь, это поможет ...

В: Зачем вам нужно присоединиться к таблице продуктов? Что (если вообще) вы выбираете, что уникально для «продуктов»?

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