4

我在条目和关键字之间有一个多对多的关系,连接表条目_关键字。我想获取键“wake”和“up”的所有条目。我想出的唯一方法就是这个。如果我想输入另一个搜索词,它会变得更糟。你如何重构这个?除了使用子查询之外,还有其他加入它的方法吗?

select * 
from 
(
    select * 
    from entries e 
    inner join entries_keywords ek 
        on e.id = ek.entry_id 
    inner join keywords k 
        on ek.keyword_id = k.id 
    where k.key = 'wake'
) e 
inner join entries_keywords ek 
    on e.id = ek.entry_id 
inner join keywords k 
    on ek.keyword_id = k.id 
where k.key = 'up';
4

2 回答 2

4

如果您只想检索至少包含一个关键字的条目,您可以执行以下操作:

SELECT
    a.*
FROM
    entries a
INNER JOIN
    entries_keywords b ON a.id = b.entry_id
INNER JOIN
    keywords c ON b.keyword_id = c.id
WHERE
    c.key IN ('wake', 'up')

如果要检索列表中包含所有关键字的条目,请添加GROUP BYHAVING

SELECT
    a.*
FROM
    entries a
INNER JOIN
    entries_keywords b ON a.id = b.entry_id
INNER JOIN
    keywords c ON b.keyword_id = c.id
WHERE
    c.key IN ('wake', 'up')
GROUP BY
    a.id
HAVING
    COUNT(*) = 2

2您正在检查的列表中的关键字数量在哪里。

于 2012-07-04T21:58:13.570 回答
0

如果我满足您的需求,您可以使用 aUNION将 2 个查询结果加入列表中:

SELECT *
FROM entries e
INNER JOIN entries_keyworkds ek
    ON e.id = ek.entry_id
INNER JOIN keywords k
    ON ek.keywork_id = k.id
WHERE k.key = 'WAKE'

UNION

SELECT *
FROM entries e
INNER JOIN entries_keyworkds ek
    ON e.id = ek.entry_id
INNER JOIN keywords k
    ON ek.keywork_id = k.id
WHERE k.key = 'up'
;

这将返回“wake”的所有条目+“up”的所有条目。

要查找具有两个键的条目,请使用INTERSECT

SELECT *
FROM entries e
INNER JOIN entries_keyworkds ek
    ON e.id = ek.entry_id
INNER JOIN keywords k
    ON ek.keywork_id = k.id
WHERE k.key = 'WAKE'

INTERSECT

SELECT *
FROM entries e
INNER JOIN entries_keyworkds ek
    ON e.id = ek.entry_id
INNER JOIN keywords k
    ON ek.keywork_id = k.id
WHERE k.key = 'up'
;

这将返回具有两个关键字的所有条目。

于 2012-07-04T21:57:53.157 回答