2016-01-13 2 views
0

В настоящее время я пытаюсь преобразовать функциональность моего сайта из использования php и текстовых файлов для использования базы данных MySQL. Я настройка базы данных и таблицы заполненыMySQL Query Help - перевод функции тегов в базу данных SQL

База данных содержит следующее:.

Table: Items 
Columns: Item_ID, Item_Name 

Table: Tags 
Columns: Tag_ID, Tag_Name 

Table: Items_Tags 
Columns: Item_ID, Tag_ID 

Как создать следующие запросы?

1) Верните имена всех элементов, имеющих 4 или более те же теги, что и элемент с именем 'x'.

Например, элемент x имеет теги a, b, c, d, e, f и item y имеет теги a, b, c, d, тогда мне нужно вернуть y и другие, у которых есть по крайней мере 4 из тех же самых тегов как х

2) возвращает имена тегов, 2 элементы имеют в общем

Расширение на один выше, с использованием х и у, возвращают, Ь, с , d, поскольку они имеют общие характеристики

3) Возвращает имена элементов, которые имеют следующие теги «а», «б», «C»

х и у будут возвращены, поскольку у них есть, б, как теги

Мои попытки до сих пор

Удалены, потому что они не были даже близко

+1

Почему тег MS SQL Server? (Не помещайте продукты, которые не задействованы ...) – jarlh

+0

Это была ошибка, и я просто удалил ее. – hermderger

+0

Школьное задание? – jarlh

ответ

0

Использование GROUP BY

select i.Item_Name, 
count(distinct t.Tag_Name) as tag_count 
from Items i join Items_Tags it on i.Item_ID = it.Item_ID 
join Tags t on it.Tag_ID = t.Tag_ID 
where i.Item_Name = 'X' 
group by i.Item_ID 
having count(distinct t.Tag_Name) >= 4; 
+0

Когда я запустил этот запрос, он просто показывает имя x с количеством тегов x. – hermderger

+0

Да, это причина возникновения условия 'WHERE' в вашем сообщении, которое вы сказали *, с определенным Item_Name = 'x' *. Удалите это условие, если вы этого не хотите. – Rahul

+0

Я думаю, что это неправильно. Верните имена всех элементов, у которых есть 4 или более те же теги, что и элемент с именем «x». Кстати, спасибо за помощь! – hermderger

0

# 1

select i.item_name, t.tag_name, 
count(t.tag_tame) as tag_count 
from items i, tags t, items_tags it 
where i.item_id = it.item_id 
and t.tag_id = it.tag_id 
and Upper(i.item_name) = Upper('x') 
group by i.item_name, t.tag_name 
having count (it.tag_id) >= 4 

# 2

select i.item_name, t.tag_name 
from items i, tags t, items_tags it 
where i.item_id = it.item_id 
and t.tag_id = it.tag_id 
and Upper(i.item_name) like Upper(:item_name) /* :item_name acts as parameter and let you send any item_name you need */ 
group by t.tag_name, i.item_name 
having count (it.tag_id) >= 1 

# 3

select i.item_name, t.tag_name 
from items i, tags t, items_tags it 
where i.item_id = it.item_id 
and t.tag_id = it.tag_id 
and ((Upper(t.tag_name) = Upper('a')) or 
    (Upper(t.tag_name) = Upper('b')) or 
    (Upper(t.tag_name) = Upper('c'))) 
group by t.tag_name, i.item_name 
+0

Счетчик (t.tag_tame) показывает только 1, даже если есть несколько вхождений тега, поэтому возвращается пустой результат. Я также не вижу, где он сравнивает теги всех других элементов с тегами 'x'. – hermderger

+0

попробуйте отправить данные образца для трех таблиц, потому что он должен нормально возвращаться только для подсчета тегов, больших или равных 4 – Mongo

+0

Для # 1 tag_count все еще остается в 1 и теперь показывает только теги для x. Для # 2 как я могу указать конкретные «x» и «y» для имен элементов? – hermderger