2011-11-07 140 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,然而,結果有沒有順序。嘗試按價格排序(這可能需要加入產品表來確定價格)。

相關問題