2009-09-03 245 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 
相关问题