データベースで検索を行っています。同時に、タグ付けシステムをインストールしました。まだすべてがタグ付けされているわけではないので、データベースからの「昔ながらの」結果も必要です。はっきりさせておきます:
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つのクエリから結合された結果を取得しようとしています。