我有以下关系表按关系描述为:

Table product(id(PK),name,type(FK),category(FK),brand(FK));

Table Specification (id(PK),name);

Table product_specification_m2m (id(PK),specification(FK),value);

Table speclist (id(PK),specification(FK),product_type(FK),listtype);


并针对产品运行此查询会带来预期的结果:

select m2m.specification,sl.product_type,sl.listtype
from product_specification_m2m m2m
     left join specification s on
     s.id = m2m.specification
     left join speclist sl on
     sl.specification = m2m.specification
     where m2m.product=626 and sl.product_type=8 and listtype="short";

     +---------------+--------------+----------+
     | specification | product_type | listtype |
     +---------------+--------------+----------+
     |            98 |            8 | short    |
     |           100 |            8 | short    |
     +---------------+--------------+----------+
     2 rows in set (0.00 sec)


但是对于product_type = 8的任何其他产品,运行此查询会带来
一个空数组! :

select m2m.specification,sl.product_type,sl.listtype
from product_specification_m2m m2m
     left join specification s on
     s.id = m2m.specification
     left join speclist sl on
     sl.specification = m2m.specification
     where m2m.product=471 and sl.product_type=8 and listtype="short";

     0 rows in set (0.00 sec)

     For listtype="long" it mysteriously brings :
     +---------------+--------------+----------+
     | specification | product_type | listtype |
     +---------------+--------------+----------+
     |           135 |            8 | long     |
     +---------------+--------------+----------+
     1 rows in set (0.00 sec)


任何人都可以指出这个谜团吗(或者说我花了3个小时也找不到我!)

编辑:

speclist表采用一些规范并将其分类为“短”列表和“长”列表。这就是我在网页上显示它们的方式。候选列表保留2/3个规范ID,长列表通常保留9/10个规范ID。

要再次使事物发光:

每种产品类型都有一套规格。

每个产品都有该类型的规格子集(该产品和规格属于该规格)

每个产品又有两个规格子集,在规格表中按“短”和“长”分类。

最佳答案

从WHERE子句中排除m2m.product = 471并检查在该条件下存在哪些产品:sl.product_type = 8和listtype =“ short”

您将其写为“ listtype =“ long”,它神秘地带来了“一条记录。没有神秘感。您正在寻找产品471,并且得到listtype =“ long”的产品,那么为什么要获得listtype =“ short”的产品呢?我假设此列表类型不存在

10-08 07:34