2009-09-03 61 views
1

我正在從prod_drop中選擇所有內容並將其他兩個表中的其他數據連接起來。我不希望重複prod_drop中的任何行,我只希望每個prod_drop行有1行。MySQL:連接3個表,按第一個表的LIMIT結果?

這裏是我的查詢:

SELECT 
    prod_drop.* 
    , prod_drop_products.product_id 
    , cart_product.product_image_sm 
FROM 
    prod_drop 
LEFT JOIN 
    prod_drop_products 
ON 
    prod_drop.prod_drop_id = prod_drop_products.prod_drop_id 
LEFT JOIN 
    cart_product 
ON 
    prod_drop_products.product_id = cart_product.product_id 
ORDER BY 
    prod_drop_id 
DESC 

這些結果如下:

prod_drop_id prod_drop_name prod_drop_available product_id product_image_sm 
51 Carat Weight yes 4971 S5-3515Y_S.jpg 
51 Carat Weight yes 4970 S5-3515Y_S.jpg 
51 Carat Weight yes 4969 S5-3515Y_S.jpg 
50 Carat Weight yes 4959 S5-3515_S.jpg 
50 Carat Weight yes 4960 S5-3515_S.jpg 
50 Carat Weight yes 4958 S5-3515_S.jpg 
49 Metal Quality yes 3269 Q-8785X-14_S.jpg 
49 Metal Quality yes 3270 Q-8785X-14_S.jpg 
48 Gold Color yes 1635 1390-Y_S.jpg 
48 Gold Color yes 1390 PE0048-12W_S.jpg 

但我只想每一行prod_drop_id(並不重要),所以基本上我希望我的結果是這樣的:

prod_drop_id prod_drop_name prod_drop_available product_id product_image_sm 
51 Carat Weight yes 4971 S5-3515Y_S.jpg 
50 Carat Weight yes 4959 S5-3515_S.jpg 
49 Metal Quality yes 3269 Q-8785X-14_S.jpg 
48 Gold Color yes 1635 1390-Y_S.jpg 

我該怎麼做?

謝謝!

+0

+1棘手的問題 – KLE 2009-09-03 19:53:25

+0

我想這樣做的原因,是我顯示督促滴的列表,但每個人都可以有與之相關的幾個產品,我只是試圖擷取其中一個相關產品的單一圖像,以在列表中顯示爲預覽。但是現在,我的清單會重複每個產品的次數,因爲有與產品相關的產品。 – 2009-09-03 20:02:24

回答

1

,你可以從您的數據中可以看出,prod_drop中的每條記錄顯然在prod_drop_products中有多條記錄。因此,如果您只希望prod_drop中每個不同行的輸出中有一行,那麼您需要從該表中刪除輸出列,或者決定prod_drop_products中的多行中的哪一個您希望輸出從中獲得它的值查詢來自此表的輸出列(product_id,具體而言)如果輸出的product_id無關緊要(從業務角度來看,這沒什麼意義,但嘿...),那麼您可以使用Min或max ()無論你喜歡什麼。如果事情確實如此,那麼請註明您要使用牛逼omake這一決定是什麼邏輯和查詢可以編輯牛逼oreflect那...

假設MIN()是好的,您可以:

SELECT pd.prod_drop_id, pd.prod_drop_name, pd.prod_drop_available,  
    Min(pp.product_id), Min(cp.product_image_sm) 
FROM prod_drop pd 
    LEFT JOIN prod_drop_products pp 
     ON pp.prod_drop_id = pd.prod_drop_id 
    LEFT JOIN cart_product cp 
     ON cp.product_id = pp.product_id 
Group By pd.prod_drop_id, pd.prod_drop_name, pd.prod_drop_available 
ORDER BY prod_drop_id DESC 
+0

是的,這工作,謝謝。我知道這聽起來不像是因爲從商業的角度來看,但這是爲了內部使用,我只需要顯示單個關聯產品的縮略圖,哪一個並不重要,因爲它們基本上都是同一種產品具有不同的屬性,如藍寶石與紅寶石。 – 2009-09-03 20:43:39

+0

@John那麼,你真的需要加入嗎?難道你不能簡單地做 「SELECT pd.prod_drop_id,pd.prod_drop_name,pd。prod_drop_available FROM prod_drop pd ORDER BY prod_drop_id DESC「?您是否真的需要顯示示例product_id和product_image_sm? – KLE 2009-09-04 08:51:07

1

我想我會嘗試MAX(或MIN)在另外兩個表上。

+0

+1是第一次使用MAX或MIN發佈......但我將Charles Bretana標記爲已接受的答案,因爲我不確定如何實施它,直到我閱讀他的帖子。 – 2009-09-03 20:49:07

+0

非常好。感謝您的親切。請看我對查爾斯答案的最後評論。 – KLE 2009-09-04 08:51:56

0

假設你的副本僅在cart_product表,試試這個:

SELECT pd.*, pdp.product_id, cp.product_image_sm 
FROM prod_drop pd 
LEFT JOIN prod_drop_products pdp ON pd.prod_drop_id = pdp.prod_drop_id 
LEFT JOIN (
    select product_id, min(product_image_sm) as product_image_sm 
    from cart_product 
    group by product_id 
) cp ON pdp.product_id = cp.product_id 
ORDER BY pd.prod_drop_id DESC 

如果有兩個表中可能的重複,你需要這樣的:

SELECT pd.*, pdp.product_id, cp.product_image_sm 
FROM prod_drop pd 
LEFT JOIN (
    select prod_drop_id, min(product_id) as product_id 
    from prod_drop_products 
    group by prod_drop_id 
) pdp ON pd.prod_drop_id = pdp.prod_drop_id 
LEFT JOIN (
    select product_id, min(product_image_sm) as product_image_sm 
    from cart_product 
    group by product_id 
) cp ON pdp.product_id = cp.product_id 
ORDER BY pd.prod_drop_id DESC 
1

試試這個:

SELECT a.*, b.product_id, c.product_image_sm 
FROM prod_drop a 
LEFT JOIN prod_drop_products b ON (a.prod_drop_id = b.prod_drop_id) 
LEFT JOIN cart_product c ON (b.product_id = c.product_id) 
GROUP BY a.prod_drop_id 
ORDER BY a.prod_drop_id DESC 
相關問題