繁体   English   中英

MySQL:联接3个表,第一个表有LIMIT个结果吗?

[英]MySQL: Joining 3 tables, LIMIT results by first table?

我从prod_drop中选择所有内容,并加入其他2个表以获取其他数据。 我不希望重复prod_drop的任何行,我只希望每prod_drop行1行。

这是我的查询:

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

我怎样才能做到这一点?

谢谢!

我想我会在另外两个表上尝试使用MAX(或MIN)。

从数据中可以看出,prod_drop_products中的prod_drop中的每条记录显然有多个记录。 因此,如果您只希望输出中prod_drop中每个不同行的一行,那么您需要从该表中消除输出列,或者决定要让prod_drop_products中的多个行中的哪一行从中获取输出值查询来自该表的输出列(特别是product_id)如果输出哪个product_id无关紧要(从业务角度来看这没有意义,但是...),则可以使用Min或max (),无论您喜欢哪个。 如果确实重要,请指定您要使用哪种逻辑来做出该决定,并可以编辑查询以免...

假设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

尝试这个:

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

假设重复项仅在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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM