2012-04-10 2 views
1

詳細はこの条件を満たしていますが、この基準を満たしていない要素を返すMySQLクエリを作成しようとしています。mysql、2つのリンクされたテーブルのクエリは、最初から秒を返しますが、この条件は満たしていません。

例として、事務用品の在庫管理システムを考えてみましょう。すべての種類の供給品がこのデータベースに含まれていて、製品の説明の各属性の列が無数にある表を作成する代わりに、代わりにこれを行いました。

CREATE TABLE `inventory`(
id INTEGER AUTO_INCREMENT PRIMARY KEY, 
element_name VARCHAR(255) NOT NULL 
); 

CREATE TABLE `inventory_detail`(
id INTEGER AUTO_INCREMENT PRIMARY KEY, 
element_id INTEGER NOT NULL, 
label VARCHAR(255) NOT NULL, 
attribute_string VARCHAR(255) NULL, 
attribute_integer INTEGER NULL 
); 

これらの表を使用して、各製品を在庫として追加し、その属性を在庫詳細として追加することができます。 (つまり、label = color、attribute_string = red、label = color、attribute_string!= blue) このメソッドを批判しないでください、それは私の質問に関するものではありません。この方法に加えて、私はいつもデータベースを変更する必要がなく、保存されている製品に関する詳細の数を絶えず変更することができます。

正の数を持つすべてのグリーン製品のリストを取得したい場合、私の質問はどのようなものになりますか。基本的に私はelement.idを返すクエリを探していますが、elmentsは、除外された詳細とそうでないものによってソートされなければなりません。例:

SELECT element.id 
FROM element 
INNER JOIN element_detail ON element.id = element_detail.id 
WHERE (element_detail.label = 'color' 
AND element_detail.attribute_string = 'green') 
AND (element_detail.label = 'count' 
AND element_detail.attribute_integer <> 0); 

#################################### 
#    INVENTORY   # 
#################################### 
# id #   label    # 
#################################### 
# 1 # multi color pen pack  # 
# 2 # single pen pack (red)  # 
# 3 # single pen pack (green) # 
# 4 # single pen pack (black) # 
# 5 # single pen pack (blue) # 
# 6 # single pen pack (purple) # 
#################################### 

######################################################## 
#     INVENTORY_DETAILS     # 
######################################################## 
# id # element_id # label # attribute_string # 
######################################################## 
# 1 #  1  # color #   red   # 
# 2 #  1  # color #   blue   # 
# 3 #  1  # color #   black  # 
# 4 #  1  # color #   green  # 
# 5 #  1  # color #   red   # 
# 6 #  1  # count #   100   # 
# 7 #  2  # color #   red   # 
# 8 #  2  # count #   50   # 
# 9 #  3  # color #   green  # 
# 10 #  3  # count #   50   # 
# 11 #  4  # color #   black  # 
# 12 #  4  # count #   50   # 
# 13 #  5  # color #   blue   # 
# 14 #  5  # count #   0   # 
# 15 #  5  # color #   purple  # 
# 16 #  5  # count #   50   # 
######################################################## 

インベントリ内のすべての製品と、赤色で緑色ではない数が返されるクエリ。

######################################## 
#    RESULT     # 
######################################## 
#  PRODUCT    # COUNT # 
# single pen pack (red) #  50 # 
# single pen pack (black) #  50 # 
# single pen pack (blue) #  0 # 
# single pen pack (purple) #  50 # 
######################################## 

多色ペンパックには赤色のペンがありますが、緑色のペンもありますので、結果に含めないでください。あなたは正の数と、すべての「グリーン」製品を使用する場合は

+0

は 'elmentsがnot'ある除外されている内容とするものでソートする必要があり、詳細テーブルの上に二回参加する必要がありますそれがどういう意味か分かりません。テーブルのサンプルデータと期待される結果を表形式で提供できますか?それはたくさんの助けになります。 [例](http://stackoverflow.com/questions/10083089/sql-query-to-group-the-data-from-two-tables) –

+0

「緑色」の商品を返品することについてのご質問に対する回答は、他の色を持っていても「緑色」のない商品を返すことについて、あなたが言及した他の質問にも当てはまりません。そのためには、「緑色」の製品のサブクエリを行い、その製品リストにNOT INを使用する必要があります。 – octern

答えて

1

あなたは

SELECT element.id 
FROM element 
INNER JOIN element_detail e1 ON element.id = e1.id 
INNER JOIN element_detail e2 ON element.id = e2.id 
WHERE (
     e1.label = 'color' 
    AND e1.attribute_string = 'green' 
) AND (
     e2.label = 'count' 
    AND e2.attribute_integer > 0 
); 
関連する問題