【问题标题】:Keep the row even when there is no value found SQL即使没有找到值 SQL 也保留该行
【发布时间】:2021-03-22 22:48:26
【问题描述】:

即使缺少值,我也会尝试保持一行。但我就是想不通。

10.4.14-MariaDB

示例查询:

SELECT
    data.name,
    am.value AS color
FROM
    color_data cd

    INNER JOIN color_data am
     ON cd.value = am.id

    INNER JOIN data
     ON cd.id = data.id

WHERE
    data.type = "vehicles"
    AND data.slug LIKE "%something%"
    AND cd.key = "color_id"
    AND am.key = "color"

我得到了什么:

----------------------
   name   |  color   |
----------------------
 car      | red
 bicycle  | blue

我想要什么:

----------------------
   name   |  color   |
----------------------
 car      | red
 boat     |         <-- When this is empty keep the row.
 bicycle  | blue

因此,当缺少颜色的 ID 时,该行将被删除。我还想保留那一排。这可能是我缺少的一些相当基本的东西。

【问题讨论】:

标签: mysql sql mariadb


【解决方案1】:

您需要使用从data 开始的JOIN 重写您的查询,使用LEFT JOIN 而不是INNER JOIN,并将条件放在连接条件中的color 表上:

SELECT
    data.name,
    am.value AS color
FROM
    data
LEFT JOIN
    color_data cd ON cd.id = data.id AND cd.key = 'color_id'
LEFT JOIN
    color_data am ON am.id = cd.value AND am.key = 'color'
WHERE
    data.type = 'vehicles'
AND data.slug LIKE '%something%'

【讨论】:

    【解决方案2】:

    使用LEFT JOINs 从要保留所有行的表开始:

    SELECT data.name, am.value AS color
    FROM data
         color_data cd LEFT JOIN
         ON cd.id = data.id AND
            cd.key = 'color_id' LEFT JOIN
         color_data am
         ON cd.value = am.id AND
            am.key = 'color'
    WHERE data.type = 'vehicles' AND
          data.slug LIKE '%something%';
    

    注意事项:

    • data 现在位于 FROM 子句的首位,因为您想保留这些行。
    • data 的过滤条件在 WHERE 子句中。
    • 其他表的过滤条件位于相应的ON 子句中。
    • 单引号是字符串的 SQL 标准,而不是双引号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多