一个神秘的MySQL选择查询

时间:2014-06-28 10:41:19

标签: mysql activerecord codeigniter-2 mysql-5.5

我有以下关系表,描述如下:

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。

再次出现问题:

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

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

并且每个产品在speclist表中再次有两个由“short”和“long”分类的规范子集。

1 个答案:

答案 0 :(得分:0)

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

你写的是" listtype =" long" 它神秘地带来"一个记录。没有神秘感。你找的是产品471,你得到的是 listtype =" long" 所以你为什么要为 listtype ="短" ?我假设它不存在 listtype