1

我正在尝试编写一个 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
);

使用这些表格可以将每个产品添加为库存,并且可以将其属性添加为库存详细信息。(即标签=颜色,属性字符串=红色或标签=颜色,属性字符串!=蓝色)不要批评这种方法,这不是我的问题所在。此外,这种方法允许我不断更改存储的产品详细信息的数量,而无需以任何方式更改数据库。

我的问题是,如果我想获得所有计数为正的绿色产品的列表,我的查询应该是什么样子。基本上,我正在寻找一个返回 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

如果您想要所有具有正数的“绿色”产品,那么您需要在明细表上加入两次

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 回答