我有两张表:products(id)
和product_images(id, parent_id, src, is_default)
每件商品都有n
张图片。
我想为每个产品获取所有产品和一个图像。
如果列is_default
为1(BOOL
),则获取该图片,否则获取第一张图片。
我的查询看起来像这样
SELECT
main.*,
images.id image_id, images.src image_src
FROM products main
LEFT JOIN product_images images ON main.id = images.parent_id AND images.is_default = 1
GROUP BY main.id
ORDER BY main.id DESC
显然JOIN
条件不对,我无法弄明白。
希望你能提供帮助,
谢谢。
答案 0 :(得分:1)
我认为第一张图片是ID最低的图片,我会从这个查询开始:
SELECT
parent_id,
COALESCE(
MIN(CASE WHEN is_default=1 THEN ID END),
MIN(id)
) AS image_id
FROM product_images
GROUP BY parent_id
这将返回is_default = 1的图像,如果没有默认的MIN(当...的情况)将为null,则COALESCE将仅选择MIN(id)。然后,您可以使用以前的子查询加入查询:
SELECT main.*, images.id image_id, images.src image_src
FROM
products main LEFT JOIN JOIN (
SELECT
parent_id,
COALESCE(
MIN(CASE WHEN is_default=1 THEN ID END),
MIN(id)
) AS min_image_id
FROM product_images
GROUP BY parent_id
) fi ON fi.parent_id = main.id
LEFT JOIN product_images images
ON images.id = fi.min_image_id
答案 1 :(得分:1)
使用GROUP_CONCAT。
通过is_default降序获取每个main的所有图像详细信息,然后按id。因此,如果没有将is_default设置为1的记录,那么它将首先获得第一个图像。然后使用SUBSTRING_INDEX获取第一个细节。
请注意,如果images.src可以包含逗号,则可能需要使用不同的分隔符。
SELECT
main.*,
SUBSTRING_INDEX(GROUP_CONCAT(images.id ORDER BY images.is_default DESC, images.id), ',', 1) AS image_id,
SUBSTRING_INDEX(GROUP_CONCAT(images.src ORDER BY images.is_default DESC, images.id), ',', 1) AS image_src
FROM products main
LEFT JOIN product_images images ON main.id = images.parent_id
GROUP BY main.id
ORDER BY main.id DESC
答案 2 :(得分:0)
您可以在子查询中获取单个图像信息:
SELECT main.*,
(SELECT images.id
FROM product_images image
WHERE main.id = images.parent_id
AND images.is_default = 1
ORDER BY images.id
) image_id,
(SELECT images.src
FROM product_images image
WHERE main.id = images.parent_id
AND images.is_default = 1
ORDER BY images.id
) image_src
FROM products main
答案 3 :(得分:0)
您需要一个子查询。我认为这是最简单的解决方案。
SELECT
*
FROM (
SELECT main.*, images.id image_id, images.src image_src
FROM products as main
LEFT JOIN product_images as images ON main.id = images.parent_id
ORDER BY images.is_default DESC
) as t
GROUP BY t.id
这样做你想要的,但是通过images.is_default desc命令,这样如果is_default是1,那么这将显示在顶部。如果设置了GROUP BY
,则外部查询is_default
将强制选择具有is_default的那个。