2014-12-07 52 views
1

我有一个联结表,可在两个其他表之间创建多对多关系。这是图。Where子句不按预期方式与联结表一起工作?

enter image description here

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

我也试图与JOIN添加条件ON但结果是一样的。请问我做错了什么?

编辑:

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

回答

0

正确的方式使用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_concatgroup 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 
+0

这是我的错误,我纠正了它。仍然不返回任何行。 – EternalHour 2014-12-07 09:36:46

+0

你正在做'AND',这意味着'tag_name'同时获得'database'和'q&a'这一行,而且这是不可能的。改变'AND'为'OR'或'IN' – 2014-12-07 09:41:28

+0

我建议有'trim(tags.tag_name)='database'或trim(tags.tag_name)='q&a''或者trim(tags.tag_name)在('数据库','q&a')中'这将确保如果有空白,那么在搜索之前这将被照顾。另外,在某些情况下,如果未正确完成保存,'&'可以从前端以'&'保存在数据库中。 – 2014-12-07 09:47:00

1

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

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

+0

谢谢,但我也试过。它只给出带有''数据库'标记的行。 – EternalHour 2014-12-07 07:26:33

+0

我不确定MySQL,但是如果它与SQL Server类似,你应该像这样使用它'WHERE tags.tag_name ='database'OR标签。tag_name ='q&a'' 检查是否有效 – Vinay 2014-12-07 07:35:47

+0

我真的不知道,我试过了我能想到的所有东西,并且一直在研究这个问题,但它只是不起作用。似乎结果是以第一个“where”返回的,而忽略了第二个结果。这可能是'JOIN'的问题,它们没有正确关联。 – EternalHour 2014-12-07 07:38:19

相关问题