我有一个表,我们称它为“选项”,其中有一些列:

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。 “用户”列中的其他行的名称可能类似于“约翰”(例如,让我们只取一个)。将带有NULL值的“用户”列作为我总是从数据库中获取的默认选项集,但是像约翰这样的某些用户具有单独的选项,我需要在默认选项之前获取他的选项。这是表格的图片:

我需要查询以获取Johns选项'key','value'参数,其中'User'为NULL,但是如果某些'User'如'John'与默认选项有所不同(如果'key'匹配,则'port'在这种情况下)我需要它仅显示John的端口,其他端口的'User'= null,没有重复,因此我需要这样的答案:


  关键价值|用户
  港口5000 |约翰
  长度3000 |空值
  国家|美国|空值


虽然数据库包含以下内容:


  关键价值|用户
  港口8080 |空
  长度3000 |空值
  国家|美国|空值
  港口5000 |约翰


我尝试了很多查询,但没有一个给我积极的结果。使用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/

10-12 16:50
查看更多