1

詳細が this を満たしているが this の基準を満たしていない要素を返す MySQL クエリを作成しようとしています。

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

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 を返すクエリを探しています。要素は、除外される詳細とそうでない詳細でソートする必要があります。例えば:

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   #
########################################

マルチカラー ペン パックには赤色のペンが含まれていますが、緑色のペンも含まれているため、結果には含まれません。

4

1 に答える 1

1

すべての「グリーン」製品を正の数にしたい場合は、詳細テーブルで 2 回結合する必要があります。

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
);
于 2012-04-10T06:07:50.253 に答える