我有一个表格,我们称它为“选项”,其中包含一些列:
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');
前几行的'User' 列设置为NULL。 'User' 列中的其他行的名称可能类似于 'John'(例如,我们只取一个)。将具有 NULL 值的 'User' 列视为我总是从数据库中获取的默认选项集,但像 John 这样的一些用户有单独的选项,我需要在默认选项之前获得他的选项。这是表格的图片:
我需要一个查询来获取 Johns options 'key', 'value' 参数,其中 'User' 是 NULL,但是如果一些'User' 像 'John' 有一些不同于默认选项的东西(如果 'key' 匹配,在这种情况下是 'port')我需要它只显示 John 的端口,而其他端口都带有 'User' = null,没有重复项,所以我需要这样的答案:
key | value | user
port | 5000 |John
length | 3000 | NULL
country | USA | NULL
虽然数据库由以下组成:
key | value | user
port | 8080 |NULL
length | 3000 | NULL
country | USA | NULL
port | 5000 | John
我尝试了很多查询,但没有一个给我肯定的结果。尝试使用自连接、右连接、左连接、不同列以及 IFNULL() 函数,但一切都是错误的。我搜索了很多,但找不到这个问题的答案,所以我很谦虚地在这里寻求帮助或建议。
最佳答案
您可以先获取默认的键值对,不包括对相应用户有值的键值对,然后使用 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'
关于mysql - 如何比较同一个表中的两列,并获得不同的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56686561/