2017-02-01 12 views
-1

シナリオ:mysqlのフィルタ行リンクテーブル内

私はメインテーブルを持っている、「items」と言います。各項目は多くの種類があり、私はテーブル "types"とリンクテーブルを使用して、2つの間の関係、典型的な1対多の状況で "items_types"の関係を保ちます。さて、各タイプは、1対1の関係を持つスーパータイプを持っています。

items: i_id, i_name 

types: t_id, t_name, t_st_id 

items_types: it_id, it_i_id, it_t_id 

supertypes: st_id, st_name 

今私は、与えられたセット内の少なくとも一つのスーパータイプに関連するすべての項目をフィルタリングする必要があり、私は上group_concatを使用することを考えていますIDS 1,2,3

とスーパータイプを言います関連するスーパータイプのIDを取得し、次にWHERE句を使用して複数のFIND_IN_SETを使用してフィルタリングするか、または相互にフィルタリングします。

しかし、これが機能していれば、クエリが遅くなり、文字列であるかのようにidを比較するのは嫌いです。

+0

良いSQL質問に答える方法については、次のガイダンスを参照してください。http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-私にとって非常にシンプルなSQLクエリー – Shadow

+0

テーブルのための小さなサンプルデータセットとあなたが望む出力の例を私たちに提供できるなら、非常に役に立ちます。 – Santi

+0

ありがとう、申し訳ありません、私はここに自分で質問を投稿するのは初めてです。しかし、私は私の問題のより良い解決策を見つけました。下記を参照してください –

答えて

0

このようにすることができます。

select i.* 
from items_types it 
join items i on i.i_id = it.it_i_id 
join types t on t.t_id = it.it_t_id 
join supertypes st on st.st_id = t.t_st_id and st_id in (1,2,3) 
0

私はより良い解決策を見つけた:代わりに、すべての種類のアイテムを追跡するために、関連レコードを使用すると、所属、私は例えば、各タイプのバイナリ比較で使用可能な数字コードを与えている:

 
Type 1: code 1 
Type 2: code 2 
Type 3: code 4 
Type 4: code 8 
Type 5: code 10 

私は考えを与えたと思います。

各項目には、 'coded_type'という名前のすべての型を追跡するフィールドがあります。例えば、フィールドがcoded_type7を有する場合、タイプ1、タイプ2、タイプ3に属することを意味する。

例えば、ユーザがタイプ2またはタイプ3のすべてのアイテムを探したい場合、 coded_typeフィールドのバイナリANDを6に設定したすべてのアイテムがゼロより大きい値を持つか調べます。

です:

select * from items where (coded_type & 6)>0 

私はこの方法は、クエリがはるかに簡単かつ迅速に実行すると思います。申し訳ありません、私は今これについて考えました。