詳細が 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 #
########################################
マルチカラー ペン パックには赤色のペンが含まれていますが、緑色のペンも含まれているため、結果には含まれません。