我有一个联结表,可以在另外两个表之间创建多对多关系。这是图表。
这是我的基本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 |
+--------------------+-------------+
这些结果基本上就是我想要的,虽然我已尝试将无法正常工作的网址分组。如果我包含一个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)和附加了多个标签。
答案 0 :(得分:1)
你需要在where子句中使用OR代替AND,因为你正在寻找数据库和q& a。
所以where条件应该与WHERE
标记.tag_name = 'database' OR 'q&a'
答案 1 :(得分:0)
在mysql中使用AND
OR
的正确方法是
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