私は一意のアイテムIDを使用して参加しているテーブルをたくさん持っています。 where句の条件の大部分は、ユーザーが嫌うフォーム(検索ボックス)からプログラムで構築され、複数の条件が同じテーブル(この場合はitemタグ)に対してテストされることがよくあります。複数のwhere節を使用して複数の表を選択すると、自己結合よりも良い方法がありますか?
私のSQLの経験はほとんどありませんが、私は基本を理解しています。私は、値が "cats"と "kittens"で、特定のタイプのタグでタグ付けされたアクティブ(status = 1)アイテムのIDを探したいと思います。タグは(id、product_id、tag_type_id、value)として格納され、idは一意の値を必要とする唯一の列です。私の最初の試みは、
select
distinct p2c.product_id
from '.TABLE_PRODUCT_TO_CATEGORY.' p2c
inner join '.TABLE_PRODUCT.' p on p2c.product_id = p.id
inner join '.TABLE_PRODUCT_TAG.' pt on p.id = pt.product_id
inner join '.TABLE_TAG_TYPE.' tt on pt.tag_type_id = tt.id
where
tt.id = '.PRODUCT_TAG_TYPE_FREE_TAG.'
and p.status = 1
and lower(pt.value) = "cats"
and lower(pt.value) = "kittens"
しかし、何も返されません。私は最終的なAND条件が問題であることを認識しました。代わりに自己結合を使用して試しました。
select
distinct p2c.product_id
from '.TABLE_PRODUCT_TO_CATEGORY.' p2c
inner join '.TABLE_PRODUCT.' p on p2c.product_id = p.id
inner join '.TABLE_PRODUCT_TAG.' pt on p.id = pt.product_id
inner join '.TABLE_PRODUCT_TAG.' pt2 on p.id = pt2.product_id
inner join '.TABLE_TAG_TYPE.' tt on pt.tag_type_id = tt.id
where
tt.id = '.PRODUCT_TAG_TYPE_FREE_TAG.'
and p.status = 1
and lower(pt.value) = "cats"
and lower(pt2.value) = "kittens"
これですべてが正常に動作し、結果セットが正しいようになりました。だから私は何を知りたいのですか?反復処理を行うには、「cats」と「kittens」の値を持つ特定のタイプのタグでタグ付けされたアクティブ(status = 1)アイテムのIDです。
- 自己結合は、これらの結果を達成する最良の方法ですか?
- このクエリは巨大になる可能性があります(カテゴリ条件は省略されていますが、そのうちの300件が存在する可能性があります)。そうでない場合は、代替手段がありますか?
- ユーザーが複雑なタグ検索を指定できるようにすると、自己結合アプローチが最善の方法です(代替があると仮定して)。すなわち「猫」および「猫」(「子猫」または「犬」)は「オウム」ではない。
値が同時に猫と子猫することはできませんので、あなたは何のレコードを得ませんでした。そのため、OR句を使用すると効果的です。 – HLGEM
しかし、ORは私が何をしたのかではないので、私は "猫"と "子猫"の両方のアイテムが欲しいです。私の最初の誤ったSQL構文の使用に関する点。一度に値を2つにすることはできません。したがって、自己結合を使用して2番目の試み... – Mathew
私は製品の "タグ"に使用されるスキーマを記述することができれば、多くの混乱が解消されると思います。 –