複数のテーブルにまたがるSQLクエリの助けを本当に感謝します。この種のことは絶えず尋ねられますが、答えを理解するのに十分な同様の質問を見つけることができません。
table_A
に対応するタグがあるtable_B
から行を選択したい。
たとえば、「「椅子」とタグ付けされたtable_a
から行を選択すると、table_C
が返されます。
また、id
はtable_a
ではなくtable_b
で一意です。
table_A: table_B: table_C:
id object id tag id object
1 lamp 1 furniture 3 stool
2 table 2 furniture 4 bench
3 stool 3 furniture
4 bench 4 furniture
4 chair
3 chair
または、データを整理するより良い方法はありますか?
最も簡単な解決策は、相関サブセレクト:
select
A.*
from
table_A A
where
A.id in (
select B.id from table_B B where B.tag = 'chair'
)
または、joinテーブルを使用して、必要な行をフィルタリングすることもできます。
select
A.*
from
table_A A
inner join table_B B
on A.id = B.id
where
B.tag = 'chair'
両方のプロファイルを作成し、データセットでどちらが速いかを確認する必要があります。
リンクテーブルを使用して、タグを独自のテーブルにする必要があります。
items:
id object
1 lamp
2 table
3 stool
4 bench
tags:
id tag
1 furniture
2 chair
items_tags:
item_id tag_id
1 1
2 1
3 1
4 1
3 2
4 2
select a.id, a.object
from table_A a
inner join table_B b on a.id=b.id
where b.tag = 'chair';
私は似たような問題を抱えています(少なくとも似ていると思います)。ここでの回答の1つでは、解決策は次のとおりです。
select
A.*
from
table_A A
inner join table_B B
on A.id = B.id
where
B.tag = 'chair'
私がなりたいWHERE句:
WHERE B.tag = A.<col_name>
または、私の特定の場合:
WHERE B.val BETWEEN A.val1 AND A.val2
より詳細な:
表Aには、機器群のステータス情報が記載されています。各ステータスレコードには、そのステータスの開始時刻と終了時刻が記録されています。表Bには、機器について定期的に記録されたタイムスタンプ付きのデータが含まれています。これは、表Aに示されている期間中に抽出したいものです。