Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
SQL many-to-many соответствие
Я внедряю систему тегов для веб-сайта. Существует несколько тегов на объект и несколько объектов на тег. Это достигается путем ведения таблицы с двумя значениями для каждой записи, по одному для идентификаторов объекта и тега.
Я ищу, чтобы написать запрос, чтобы найти объекты, которые соответствуют заданному набору тегов. Предположим, у меня были следующие данные (в формате [object] - > [tags]* )
apple -> fruit red food
banana -> fruit yellow food
cheese -> yellow food
firetruck -> vehicle red
Если я хочу соответствовать (красный), я должен получить apple и firetruck. Если я хочу соответствовать (фрукты, еда), я должен получить (яблоко, банан).
Как написать запрос SQL do do what I want?
@Jeremy Рутен,
Спасибо за ваш ответ. Используемая нотация использовалась для предоставления некоторых образцов данных - в моей базе данных есть таблица с 1 идентификатором объекта и 1 тегом на запись.
Во-вторых, моя проблема заключается в том, что мне нужно получить все объекты, соответствующие всем тегам. Подставляя свой OR вместо AND вот так:
SELECT object WHERE tag = 'fruit' AND tag = 'food';
Не дает никаких результатов при запуске.
Дано:
- таблица объектов (идентификатор первичного ключа)
- таблица objecttags (внешние ключи objectId, tagid)
таблица тегов (идентификатор первичного ключа)
SELECT distinct o.* from object o join objecttags ot on o.Id = ot.objectid join tags t on ot.tagid = t.id where t.Name = 'fruit' or t.name = 'food';
Это кажется обратным, так как вы хотите и, но проблема в том, что 2 тега не находятся в одной строке, и поэтому, и ничего не дает, так как 1 одиночный ряд не может быть одновременно фруктом и едой. Этот запрос обычно дает дубликаты, потому что вы получите по 1 строке каждого объекта на тег.
Если вы действительно хотите сделать и в этом случае, вам понадобится group by и having count = <number of ors> в вашем запросе, например.
SELECT distinct o.name, count(*) as count
from object o join objecttags ot on o.Id = ot.objectid
join tags t on ot.tagid = t.id
where t.Name = 'fruit' or t.name = 'food'
group by o.name
having count = 2;
О боже, возможно, я неправильно истолковал ваш первоначальный комментарий.
Самый простой способ сделать это в SQL - это иметь три таблицы:
1) Tags ( tag_id, name )
2) Objects (whatever that is)
3) Object_Tag( tag_id, object_id )
Затем вы можете задать практически любой вопрос, который вы хотите получить из данных быстро, легко и эффективно (при условии, что вы индексируете соответствующим образом). Если вы хотите стать модным, вы также можете разрешить многозначные теги (есть элегантный способ, и я могу придумать менее элегантный способ).
Я предполагаю, что это то, что у вас есть, так что этот SQL ниже будет работать:
Буквальный путь:
SELECT obj
FROM object
WHERE EXISTS( SELECT *
FROM tags
WHERE tag = 'fruit'
AND oid = object_id )
AND EXISTS( SELECT *
FROM tags
WHERE tag = 'Apple'
AND oid = object_id )
Есть и другие способы, которыми вы можете это сделать, например:
SELECT oid
FROM tags
WHERE tag = 'Apple'
INTERSECT
SELECT oid
FROM tags
WHERE tag = 'Fruit'
Объедините предложение Стива м. с предложением Джереми вы получите одну запись с тем что вы ищете:
select object
from tblTags
where tag = @firstMatch
and (
@secondMatch is null
or
(object in (select object from tblTags where tag = @secondMatch)
)
Теперь это не очень хорошо масштабируется, но он получит то, что вы ищете. Я думаю, что есть лучший способ сделать это, чтобы вы могли легко иметь N совпадающих элементов без большого влияния на код, но в настоящее время он ускользает от меня.
Я бы предложил сделать так, чтобы ваша таблица имела 1 тег на запись, как это:
apple -> fruit
apple -> red
apple -> food
banana -> fruit
banana -> yellow
banana -> food
Тогда вы могли бы просто
SELECT object WHERE tag = 'fruit' OR tag = 'food';
Если вы действительно хотите сделать это по-своему, Вы можете сделать это так:
SELECT object WHERE tag LIKE 'red' OR tag LIKE '% red' OR tag LIKE 'red %' OR tag LIKE '% red %';