sql запрос не возвращает результата с отношением многие ко многим - PullRequest
0 голосов
/ 06 февраля 2020

Я хотел бы начать с объяснения того, как выглядит мой БД. У меня есть таблица элементов, которая относится ко многим со многими двумя тегами таблиц и ключевыми словами.

table: item
columns: id, name, subcategory, category
table: item_tag_join
columns: itemId, tagId
table: tag
columns: id, name
table: item_keyword_join
columns: itemId, keywordId
table: keyword
columns: id, name

Теперь я хочу выполнить поиск по ключевым словам: name.name, tag.name, item.name, item.category. и item.subcategory и вернуть элемент из таблицы item, когда любой из столбцов содержит ожидаемую строку.

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

т.е. я добавил «Ferrari» к предмету и хочу найти «rar», он возвращается без результатов. Я работаю с sqllite3, и вот запрос, который мне нужен Ваша помощь с:

SELECT DISTINCT item.* 
from item, tag, keyword 
LEFT JOIN item_tag_join ON 
item.id = item_tag_join.item_id
LEFT JOIN item_keyword_join ON item.id = item_keyword_join.item_id
WHERE UPPER(item.name) LIKE UPPER('%' || "cab"  || '%') 
or UPPER(item.category) LIKE UPPER('%' || "cab" || '%') 
or UPPER(item.sub_category) LIKE UPPER('%' || "cab" || '%') 
or (tag.id = item_tag_join.tag_id and UPPER(tag.name) LIKE UPPER('%' || "cab" || '%')) 
or (keyword.id = item_keyword_join.keyword_id and UPPER(keyword.name) LIKE UPPER('%' || "cab" || '%'));

Приветствия.

1 Ответ

0 голосов
/ 06 февраля 2020

Получилось, разбив операторы на три отдельных выбора и применив оператор UNION https://www.w3schools.com/sql/sql_union.asp

...