私は2つのテーブルを持っています:
CREATE TABLE `categories` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`asset_id` int(10) unsigned NOT NULL DEFAULT '0',
`title` mediumtext NOT NULL,
`published` tinyint
)
CREATE TABLE `content` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`asset_id` int(10) unsigned NOT NULL DEFAULT '0',
`title` mediumtext NOT NULL,
`catid` int(10) unsigned NOT NULL DEFAULT '0'
)
コンテンツ テーブルの 'catid' には、このコンテンツが属するカテゴリも格納されています (つまり、カテゴリ テーブルの 'id')。次に、'有効な' アセット (カテゴリとコンテンツの両方) のリストを抽出します。次のクエリを使用して、すべての「公開」カテゴリとその中のコンテンツを一覧表示します。
SELECT asset_id, title
FROM (SELECT asset_id, title FROM categories WHERE published=1) AS ca
UNION ALL
(SELECT asset_id, title FROM content WHERE catid IN
(select id FROM categories WHERE published = 1)
)
私は望ましい結果を得ることができます。ただし、クエリでFROM categories WHERE published = 1
が繰り返されていることがわかります (実際の場合、条件は単なる よりもはるかに長くなりますpublished = 1
)。それを行うより良い方法はありますか?
私のアセットには「カテゴリ」内の「コンテンツ」内に「画像」が含まれているため、各サブクエリで一連の条件全体を繰り返す必要がありますUNION ALL
。クエリをデバッグするのは地獄のようです。
select id, asset_id, title from categories ... AS ca
2番目のサブクエリのセットとして「id」列を抽出して抽出する方法があるかどうかを考えていますFROM content WHERE id IN ca.id
(もちろん、これは機能していません)。「WITH」を試しましたが、Mysql はサポートしていません。どうもありがとうございました。