我有一个表,我们称它为“选项”,其中有一些列:
CREATE TABLE IF NOT EXISTS `options` (`key` VARCHAR(255), `value` VARCHAR(255), `user` VARCHAR(255));
一些带有NULL user
字段的数据,例如:
INSERT INTO `options` (`key`, `value`) VALUES ('port', '8080'), ('length', '3000'), ('country', 'USA');
还有一行名为{John的user
字段:
INSERT INTO `options` (`key`, `value`, `user`) VALUES ('port', '5000', 'John');
前两行的“用户” 列设置为 NULL 。 “用户” 列中的其他行可能具有类似'John'之类的名称(例如,仅用一个)。考虑带有 NULL 值的'User'列作为我总是从数据库中获取的默认选项集,但是像John这样的某些User有单独的选项,我需要在默认选项之前获得他的选项。这是表格的图片:
我需要查询以获取Johns选项的“键”,“值” 参数,其中“用户” 为 NULL ,但是如果某些“用户” (如'John')与默认选项有所不同(如果匹配“键”,则为“端口” )需要它只显示John的端口,其他都用'User'= null,没有重复,所以我需要这样的答案:
键|价值|用户
港口5000 |约翰
长度3000 | NULL
国家|美国| NULL
虽然数据库由以下内容组成:
键|价值|用户
港口8080 | NULL
长度3000 | NULL
国家|美国| NULL
港口5000 |约翰
我尝试了很多查询,但没有一个给我积极的结果。使用 IFNULL()函数尝试使用自连接,右连接,左连接,离散列进行操作,但是一切都不对。我进行了很多搜索,但找不到答案,因此在这里谦虚地寻求帮助或建议。
答案 0 :(得分:2)
您可以首先获取默认键值对,但不包括具有对应用户值的键对,然后使用UNION
并为用户获取键值对。
使用NOT IN
和子查询的查询:
SELECT * FROM `options` WHERE `user` IS NULL
AND `key` NOT IN
(SELECT `key` FROM `options` WHERE `user`='John')
UNION ALL
SELECT * FROM `options` WHERE `user`='John'
使用JOIN
SELECT o.* FROM `options` o
LEFT JOIN
(SELECT `key` FROM `options` WHERE `user`='John') o2
ON o.key=o2.key WHERE o2.key IS NULL AND o.user IS NULL
UNION ALL
SELECT * FROM `options` WHERE `user`='John'
答案 1 :(得分:1)
使用CASE
子句将简单逻辑应用于查询。例如:
select
key,
case when user is not null then user else value end as value
from t