0

データベースで検索を行っています。同時に、タグ付けシステムをインストールしました。まだすべてがタグ付けされているわけではないので、データベースからの「昔ながらの」結果も必要です。はっきりさせておきます:

Table A
+----+----------------------------+
| ID | description                |
+----+----------------------------+
|  0 | horse going bad            |
|  1 | Older Years of Resolutions |
|  2 | The 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 * from A where locate('list',description)

テーブル A から ID 3 と 4 を取得します。これはすばらしいことです。

この検索を行うと:

select * from tags
   join taglinks on tagid=tags.id
   join A on A.id=jokeid
where tag='list'

テーブル A から ID 2 と 3 を取得します。

取得したいのは ID 2、3、および 4 です。したがって、2 つの結果を結合します。私はこれを試しました:

select * from tags
   join taglinks on tagid=tags.id
   join A on A.id=jokeid or locate('list',description)

正しい結果が得られたようですが、サーバーが詰まるほど遅いです (実際には、テーブルはここの例よりもはるかに大きくなります)。複合クエリが必要な理由は、ORDER BY や LIMIT などの関数が必要だからです。したがって、上記の2つのクエリから結合された結果を取得しようとしています。

4

1 に答える 1

1

Eugen Rieck と Raheel Shan が指摘したように、答えは結合です。

select A.* from tags
  join taglinks on tagid=tags.id
  join A on A.id=jokeid
where tag="list"
UNION
select * from A where locate("list",description)

ID 2、3、4 を教えてくれます

于 2013-01-09T13:59:35.713 に答える