2014-12-07 5 views
1

У меня есть таблица соединений, которая создает отношения «многие ко многим» между двумя другими таблицами. Вот диаграмма.Где предложение не работает, как ожидалось, с помощью соединительной таблицы?

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) 

Я также попытался добавить условие в ON с JOIN, но результат был тот же. Что я делаю неправильно?

EDIT:

Целью данного запроса является извлечение одного или нескольких тегов вместе со списком 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') 

EDIT: Вот запрос, который может сделать работу с помощью 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 
+0

Это была опечатка с моей стороны, и я ее исправил. Все равно не возвращает строк. – EternalHour

+0

Вы делаете 'AND', и это означает, что вы получаете строку, где' tag_name' одновременно является «базой данных» и «q & a», и это невозможно. Изменить 'AND' на' OR' или 'IN' –

+0

Я бы предложил иметь' where trim (tags.tag_name) = 'database' OR trim (tags.tag_name) = 'q & a'' или 'trim (tags.tag_name) in ('database', 'q & a') 'это гарантирует, что если есть пробел, то перед поиском это будет позаботиться. Кроме того, при сохранении в некоторых случаях '&' можно было бы сохранить в БД как '&' от переднего конца, если оно сделано неправильно. –

1

Вам нужно использовать OR вместо AND в предложении where, так как вы ищете базу данных и q & a.

поэтому условие, где должно быть как WHERE теги .tag_name = 'database' OR 'q&a'

+0

Спасибо, но я тоже это пробовал. Он дает только строки с тегом 'база '. – EternalHour

+0

Я не уверен в MySQL, но если он похож на SQL Server, вы должны использовать его так: 'WHERE tags.tag_name = 'database' OR tags.tag_name = 'q & a'' проверить, работает ли это – Vinay

+0

Я, честно говоря, не знаю, я пробовал все, что мог придумать, и проводил исследования в течение нескольких дней, но это просто не сработает. Кажется, что результаты возвращаются с первым 'where', и он игнорирует второй. Это может быть проблемой с 'JOIN', и они не связаны должным образом. – EternalHour

Смежные вопросы