MySQL JOIN, GROUP BY, ORDER BY

北慕城南 提交于 2019-12-10 04:38:50

问题


I have a table of products:

CREATE TABLE products (`id` INT);

And a table of images for those products:

CREATE TABLE images (`id` INT, `product_id` INT, `default` TINYINT(1));

I need to select all the products, and join the images table so that images with (default = 1) will be preferred, and if a product has no images with (default = 1), an image with (default = 0) will be shown in its place.


Here's an image showing what I'm looking for:


Right now I have this query:

SELECT p.id, i.id
FROM products AS p
LEFT JOIN (
    SELECT product_id, url
    FROM images
    ORDER BY default
) AS i
ON p.id = i.product_id
GROUP BY p.id
ORDER BY p.name

Which doesn't prioritize "default" images. The subquery doesn't seem to do anything.


回答1:


SQLFiddle demo

select products.id,
       coalesce(t1.mid,t2.mid) as image_id      

from products
left join (select min(id) mid,product_id 
                  from images where `default`=1
                  group by product_id ) t1
        on products.id=t1.product_id
left join (select min(id) mid,product_id 
                  from images where `default`=0
                  group by product_id ) t2
        on products.id=t2.product_id



回答2:


Looks like I was just missing a 'DESC' in the subquery's ORDER BY

:\




回答3:


If you want to show only one image for product, then try this query -

SELECT p.*, i.* FROM products p
  JOIN (SELECT * FROM images ORDER BY `default` DESC) i
    ON p.id = i.product_id
GROUP BY p.id



回答4:


Try this:

SELECT 
  p.id productid, 
  IFNULL(i1.id, i2.id)
FROM products    AS p
LEFT JOIN images AS i1  ON p.id = i1.product_id
                       AND i1.`Default` = 1  
LEFT JOIN images AS i2  ON p.id = i2.product_id
                       AND i2.`Default` = 0
GROUP BY p.id;


来源:https://stackoverflow.com/questions/14079799/mysql-join-group-by-order-by

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!