MySQL JOIN:如果bool列为1,则选择一行,否则选择第一行

时间:2015-12-08 13:57:39

标签: mysql join

我有两张表: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条件不对,我无法弄明白。

希望你能提供帮助,

谢谢。

4 个答案:

答案 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的那个。