0

検索したい以下のテーブルがあります。

Table A
+----+----------------------------+
| ID | description                |
+----+----------------------------+
|  0 | horse going bad            |
|  1 | Older Years of Resolutions |
|  2 | The knockknock pirate      |
|  3 | The Wish list              |
|  4 | list that's no list        |
+----+----------------------------+

table TAGS
+----+------------+
| ID | tag        |
+----+------------+
|  0 | list       |
|  1 | knockknock |
+----+------------+

table TAGLINKS
+-------+--------+
| TAGID | JOKEID |
+-------+--------+
|   0   |    2   |
|   0   |    3   |
+-------+--------+

この検索を行うと:

select A.* from tags
   join taglinks on tagid=tags.id
   join A on A.id=jokeid
where tag in ('list','knockknock') 

タグに「list」または「knockknock」のいずれか (または両方) を持つ A のすべてのエントリが表示されます (2,3)。私が探しているのは、両方のリストとノックノック タグ (2 のみ) に接続されているテーブル A からエントリを取得するクエリです。

また、テーブル A の説明を直接検索してこのデータを結合しています。これは考慮すべきことです。

今私は持っています:

select A.* from tags
   join taglinks on tagid=tags.id
   join A on A.id=jokeid
where tag in ('list','knockknock') 

UNION

select * from A where locate('list',description) and locate('knockknock',description)

しかし、テーブルAからも3つ取得します。2つだけが必要です

4

2 に答える 2

2

すべてに2つのタグがあることを確認するには、次の句を'list', 'knockknock'追加する必要があります。GROUP BYHAVING

...
WHERE tag in ('list', 'knockknock')
GROUP BY tag
HAVING COUNT(tag) = 2)

何かのようなもの:

SELECT A.* 
FROM tags
INNER JOIN taglinks ON tagid = tags.id
INNER JOIN A on A.id=jokeid
WHERE id IN (SELECT id
             FROM tags
             WHERE tag in ('list', 'knockknock')
             GROUP BY tag
             HAVING COUNT(tag) = 2)
于 2013-01-09T14:58:19.913 に答える
1

これは、タグをセットとして見て、そのセットのプロパティを探す例です。havingこれには、SQL の集計関数、特に句を使用してアプローチするのが好きです。

select A.*
from tags join
     taglinks
     on tagid=tags.id join
     A on A.id=jokeid
group by A.id
having max(tag = 'list') = 1 and
       max(tag = 'knockknock') = 1

(注: これは 2 つの MySQL 固有の構文規則を使用します。group byは id 列のみにあり、残りは「隠し列」です。また、式tag = 'list'は実際の値として扱われるため、完全なcaseステートメントは必要ありません。)

ちなみに、これをあるタグまたは別のタグに切り替えるのは簡単です。

select A.*
from tags join
     taglinks
     on tagid=tags.id join
     A on A.id=jokeid
group by A.id
having max(tag = 'list') = 1 or
       max(tag = 'knockknock') = 1
于 2013-01-09T15:07:17.213 に答える