У меня есть таблица соединений, которая создает отношения «многие ко многим» между двумя другими таблицами. Вот диаграмма.Где предложение не работает, как ожидалось, с помощью соединительной таблицы?
Вот моя база SQL-запрос.
SELECT `tag_to_url`.url_id, `websites`.url, `tags`.tag_name
FROM `tag_to_url`
INNER JOIN (`websites`,`tags`) ON `websites`.url_id = `tag_to_url`.url_id
AND `tag_to_url`.tag_id = `tags`.tag_id
ORDER BY `tag_to_url`.url_id
Это пример из этого.
+--------------------+-------------+
| url | tag_name |
+--------------------+-------------+
| google.com | search |
| google.com | e-mail |
| stackexchange.com | q&a |
| stackexchange.com | programming |
| stackexchange.com | database |
+--------------------+-------------+
Эти результаты в основном являются тем, что я ищу, хотя я попытался сгруппировать URL-адрес, который работает неправильно. Запрос также будет работать правильно, если я включу один пункт WHERE
.
...
...
WHERE `tags`.tag_name = 'database'
+--------------------+-------------+
| url | tag_name |
+--------------------+-------------+
| stackexchange.com | database |
+--------------------+-------------+
Но, когда я добавляю оператор AND
условию WHERE
, я ожидал этого.
WHERE `tags`.tag_name = 'database' AND `tags`.tag_name = 'q&a'
+--------------------+-------------+
| url | tag_name |
+--------------------+-------------+
| stackexchange.com | database |
| stackexchange.com | q&a |
+--------------------+-------------+
Однако, я получаю:
MySQL returned an empty result set (i.e. zero rows). (Query took 0.0027 sec)
Я также попытался добавить условие в ON
с JOIN
, но результат был тот же. Что я делаю неправильно?
EDIT:
Целью данного запроса является извлечение одного или нескольких тегов вместе со списком URL, связанного с ними. Мне нужно иметь возможность использовать несколько операторов AND
для извлечения только тех конкретных тегов. Он должен работать как переполнение стека, где есть вопрос (URL) и несколько тегов, прикрепленных к нему.
Это была опечатка с моей стороны, и я ее исправил. Все равно не возвращает строк. – EternalHour
Вы делаете 'AND', и это означает, что вы получаете строку, где' tag_name' одновременно является «базой данных» и «q & a», и это невозможно. Изменить 'AND' на' OR' или 'IN' –
Я бы предложил иметь' where trim (tags.tag_name) = 'database' OR trim (tags.tag_name) = 'q & a'' или 'trim (tags.tag_name) in ('database', 'q & a') 'это гарантирует, что если есть пробел, то перед поиском это будет позаботиться. Кроме того, при сохранении в некоторых случаях '&' можно было бы сохранить в БД как '&' от переднего конца, если оно сделано неправильно. –