2011-11-02 47 views
1

我有這個疑問小組正在擺脫一些行?

SELECT *, bp.product_id 
FROM builder_product as bp 
JOIN builder_step as bs 
    ON bs.builder_id=bp.builder_id 
JOIN builder as b 
    ON b.builder_id=bs.builder_id 
WHERE b.business_id = '60' 
GROUP BY product_id 
ORDER BY bs.step_number 

這是抓住所有的產品從builder_product表,一切看起來正常,但仔細看數據丟失幾個記錄,所有的名字都是一樣的。

這裏是data and the schema,基本上我想做的是,讓我所有從builder_product表中的產品及相應的名字從builder_step表60從builder tablebusiness_id查詢。

任何想法我做錯了,如何避免重複?

回答

1

從您的模式中不清楚是否builder_productbuilder_stepbuilder_idbuilder_step_id有關。如果你澄清,我會修改下面的答案。

您沒有執行任何聚合函數(SUM(), COUNT(), AVG()),因此您不需要GROUP BY。相反,你只是有幾個JOIN s到執行:

SELECT 
    bp.*, 
    bs.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 
WHERE b.business_id = 60 

的重複嘗試SELECT *不指定表名/別名的結果。相反,SELECT bp.*, bs.name表示具體應該返回builder_product的所有列,加上builder_stepbuilder_name列。

+0

我這樣做,並返回176條記錄,我只有22個產品......難道我失去了一些東西 – Trace

+0

這就是爲什麼我用,因爲查詢返回176行做了組 – Trace

+0

它們與builder_step_id相關 – Trace

1

您不應該選擇未在group by子句中列出的行。
MySQL允許這樣做,但有一些pittfals。
大多數其他SQL在您的查詢中給出錯誤。

重寫它:

SELECT bp.*, bs.*, b.* 
FROM FROM builder_product as bp 
INNER JOIN builder_step as bs ON bs.builder_id=bp.builder_id 
INNER JOIN builder as b ON b.builder_id=bs.builder_id 
WHERE bp.product_id IN 
    (
    SELECT bp1.product_id 
    FROM builder_product as bp1 
    JOIN builder_step as bs1 ON bs1.builder_id = bp1.builder_id 
    JOIN builder as b1 ON b1.builder_id = bs1.builder_id 
    WHERE b1.business_id = '60' 
    GROUP BY bp1.product_id 
) 
    AND b.business_id = '60' 
ORDER BY bs.step_number