1

我有一个联结表,它在其他两个表之间创建多对多关系。这是图表。

在此处输入图像描述

这是我的基本 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)

我也尝试在其中添加条件,ONJOIN结果是一样的。请问我做错了什么?

编辑 :

此查询的目的是获取一个或多个标签以及与其关联的 URL 列表。我需要能够使用多个AND运算符来仅检索那些特定的标签。它需要像堆栈溢出一样工作,其中有一个问题(URL)和多个附加标签。

4

2 回答 2

1

您需要在 where 子句中使用 OR 而不是 AND,因为您要同时查找数据库和 q&a。

所以 where 条件应该像WHERE标签.tag_name = 'database' OR 'q&a'

于 2014-12-07T07:23:07.577 回答
0

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
于 2014-12-07T09:21:26.220 回答