问题
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