4

結合テーブルentries_keywordsを使用して、エントリとキーワードの間に多対多の関係があります。キー「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

少なくとも1つのキーワードを持つエントリのみを取得する場合は、次の操作を実行できます。

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

必要に応じて、を使用しUNIONて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 に答える