Где пункт не работает, как ожидалось с соединительной таблицей?

У меня есть соединительная таблица, которая создает отношение многие ко многим между двумя другими таблицами. Вот диаграмма.

Вот мой базовый 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 ответа

Решение

Правильный способ использования ANDOR в 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'

Другие вопросы по тегам