为什么这个查询没有获取正确的记录?

时间:2011-11-07 21:01:36

标签: mysql subquery

我有这个问题:

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任何想法如何改变这个

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您的子选择返回返回的第一个条目,因为您使用了LIMIT 1,但是,没有订购结果。尝试按价格订购子选择(这可能需要与产品表联系以确定价格)。