MySQL - реляционные базы данных и теги - PullRequest
3 голосов
/ 13 августа 2011

Я некоторое время ломал голову над этим, поэтому решил, что перепрошу стек (Примечание: я новичок в SQL, пытающийся выучить больше SQL, поэтому будьте внимательны и объяснительны):

У меня есть одна таблица sql, которая выглядит так, называемая "posts":

id | user
--------------------------------
0  | tim
1  | tim
2  | bob

И еще одна, называемая "tags", которая хранит теги в сообщениях (в "posts""таблица) в тексте:

id | postID | tag
--------------------------------
0  | 0      | php
1  | 2      | php
2  | 0      | mysql
3  | 1      | mysql
4  | 1      | sql
5  | 3      | perl

(Для пояснения, концепция, в которой: id = 0 помечена как php, mysql; id = 1 помечена как sql, mysql; id = 2 помечена как php; id =3 помечено как perl.)

Как можно написать оператор WHERE, чтобы получить сообщения с тегом x, но не y (x и y будут определены php)?

Например, как я могу получить все сообщения с тегом mysql, но не с php?

РЕДАКТИРОВАТЬ

Не могли бы вы также объяснить, как добавить несколько тегов для поиска (например, получить все тегированные mysql и рекурсию?)но не php)

Ответы [ 3 ]

2 голосов
/ 13 августа 2011
select *
from
    (select distinct postID
    from tags
    where tag = "mysql") as t1
left join
    (select distinct postID
     from tags
     where tag = "php") as t2
using (postID)
where t2.postID is NULL

пример 2: получить все теги mysql и recursion, но не php:

select *
from
    ((select distinct postID
    from tags
    where tag = "mysql") as t1
join
    (select distinct postID
    from tags
    where tag = "recursion") as t3
using (postID))
left join
    (select distinct postID
     from tags
     where tag = "php") as t2
using (postID)
where t2.postID is NULL
1 голос
/ 13 августа 2011

Наивно, просто и переносимо:

SELECT *
FROM posts
WHERE EXISTS (SELECT * FROM tags WHERE tags.postid = posts.id AND tags.tag = 'x')
AND NOT EXISTS (SELECT * FROM tags WHERE tags.postid = posts.id AND tags.tag = 'y')

Теперь, в зависимости от плана выполнения, вы можете сделать другие вещи, чтобы оптимизировать это.

1 голос
/ 13 августа 2011

Мое предложение с EXISTS:

SELECT DISTINCT postID
FROM tags t1
WHERE EXISTS(SELECT NULL
             FROM tag t2
             WHERE t2.id = t1.id
               AND t2.tag = 'x')
  AND NOT EXISTS(SELECT NULL
                   FROM tag t2
                  WHERE t2.id = t1.id
                    AND t2.tag = 'y')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...