Где пункт не работает, как ожидалось с соединительной таблицей?
У меня есть соединительная таблица, которая создает отношение многие ко многим между двумя другими таблицами. Вот диаграмма.
Вот мой базовый 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
но результат был тот же. Что я делаю не так, пожалуйста?
РЕДАКТИРОВАТЬ:
Целью этого запроса является получение одного или нескольких тегов вместе со списком URL-адресов, связанных с ними. Мне нужно иметь возможность использовать несколько AND
операторы, чтобы получить только эти конкретные теги. Это должно работать как переполнение стека, где есть вопрос (URL) и несколько тегов, прикрепленных к нему.
2 ответа
Правильный способ использования AND
OR
в MySQL есть
select * from `table` where col1 = 'someval' and col2='someval' ;
select * from `table` where col1 = 'someval' OR col1='someval' ;
Вам необходимо указать имена столбцов в каждом условии.
Таким образом, вы должны иметь запрос как
WHERE `tags`.tag_name = 'database' OR `tags`.tag_name 'q&a'
Также эквивалентное утверждение может быть IN
WHERE `tags`.tag_name IN('database','q&a')
РЕДАКТИРОВАТЬ: Вот запрос, который может сделать работу с помощью group_concat
а также group by
SELECT
tu.url_id,
w.url,
group_concat(t.tag_name) as tag_name
FROM tag_to_url tu
inner join websites w on w.url_id = tu.url_id
inner join tags t on t.tag_id = tu.tag_id
where t.tag_name in ('database','q&a')
group by w.url
having count(*) = 2
Вам нужно использовать OR вместо AND в предложении where, так как вы ищете и базу данных, и вопросы и ответы.
так что где условие должно быть как WHERE
теги.tag_name = 'database' OR 'q&a'