2011-11-07 100 views
1

我有这个疑问:为什么这个查询没有抓取正确的记录?

SELECT 
     bp.product_id,bs.step_number, 
     p.price, pd.name as product_name 
    FROM 
     builder_product bp 
     JOIN builder_step bs ON bp.builder_step_id = bs.builder_step_id 
     JOIN builder b ON bp.builder_id = b.builder_id 
     JOIN product p ON p.product_id = bp.product_id 
     JOIN product_description pd ON p.product_id = pd.product_id 
     WHERE b.builder_id = '74' and bs.optional != '1' 
    ORDER by bs.step_number, p.price 

这是返回

88 1 575.0000 Lenovo Thinkcentre POS PC 
    92 1 799.0000 Lenovo Thinkcenter Server - RAID Configured 
    31 1 1599.0000 All-In-One - Lenovo Thinkcentre 23" 
    63 2 169.0000 Lenovo Thinkvision 18.5" - LCD 
    62 2 249.0000 Lenovo Thinkvision 22" - LCD 
    244 2 559.0000 Touchscreen with MSR - Firebox 15" 
    104 3 285.0000 Remote Order Printer - Epson 
    65 3 355.0000 Barcode and Label Printer - Zebra 2" TT 
    68 3 399.0000 Barcode And Label Printer - Zebra 4" DT 
    254 4 106.0000 Cash Drawer - APG - 14X16 - Black 
    251 4 195.0000 Cash Drawer - APG - 16X16 - Serial 
    97 4 395.0000 Aldelo Lite 
    97 5 395.0000 Aldelo Lite 
    121 5 549.0000 Cash Register Express - Pro 
    279 5 849.0000 Aldelo Premium 
    135 6 0.0000  Free!! Payment Processing Software 
    191 6 349.0000 Integrated Payment Processing 
    231 7 0.0000 1 User/Location - 8Am - 8Pm Mon - Fri Support Plan - Level 1 
    232 7 0.0000 1 User/Location - 24 X 7 X 365 Support Plan - Level 1 
    155 7 369.0000 Accessory - Posiflex 12.1" LCD Customer Display 

我需要的是从每个步骤,因此我以为添加子查询的最低价格会像这样工作

SELECT 
     bp.product_id,bs.step_number, 
     p.price, pd.name as product_name 
    FROM 
     builder_product bp 
     JOIN builder_step bs ON bp.builder_step_id = bs.builder_step_id 
     JOIN builder b ON bp.builder_id = b.builder_id 
     JOIN product p ON p.product_id = bp.product_id 
     JOIN product_description pd ON p.product_id = pd.product_id 
     WHERE b.builder_id = '74' and bs.optional != '1' 
     AND bp.builder_product_id = (
      SELECT builder_product_id 
      FROM builder_product as alt 
      WHERE alt.step_number = bp.step_number 
      LIMIT 1 
     ) 
    ORDER by bs.step_number, p.price 

但我得到这个返回

88 1 575.0000 Lenovo Thinkcentre POS PC 
244 2 559.0000 Touchscreen with MSR - Firebox 15" 
104 3 285.0000 Remote Order Printer - Epson 
97 4 395.0000 Aldelo Lite 
121 5 549.0000 Cash Register Express - Pro 
191 6 349.0000 Integrated Payment Processing 
155 7 369.0000 Accessory - Posiflex 12.1" LCD Customer Display 

这是不正确的,因为你可以看到第2步应该返回

63 2 169.0000 Lenovo Thinkvision 18.5" - LCD 

因为169.000是小于559.000任何想法如何改变这种

回答

3

查找到GROUP BYMIN。试试这个

SELECT 
    bp.product_id,bs.step_number, 
    MIN(p.price) as price, 
    pd.name as product_name 
FROM 
    builder_product bp 
    JOIN builder_step bs ON bp.builder_step_id = bs.builder_step_id 
    JOIN builder b ON bp.builder_id = b.builder_id 
    JOIN product p ON p.product_id = bp.product_id 
    JOIN product_description pd ON p.product_id = pd.product_id 
WHERE b.builder_id = '74' and bs.optional != '1' 
GROUP BY bp.product_id 
ORDER by bs.step_number, p.price 
+0

此查询失败您的SQL语法中有错误;检查对应于你的MySQL服务器版本使用附近“价格, pd.name因为这里给 FROM builder_product BP JOIN builder_step”在行3 – Trace

+0

错字正确的语法手册,本来应该作为'和price'而不是'作为p.price' – Fabrizio

+0

更改GROUP BY bs.step_number为此,所有都很好...再次感谢 – Trace

0

你的子查询中返回的第一个条目返回,因为你使用LIMIT 1,然而,结果有没有顺序。尝试按价格排序(这可能需要加入产品表来确定价格)。

相关问题