我试图保留一行,即使它缺少值。但我就是想不通。
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丢失时,该行将被删除。我想保持这一排。这可能是我所缺少的相当基本的东西。
您需要用从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%'
从要保存所有行的表开始使用LEFT JOIN
:
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标准,而不是双引号