如何比较同一张表中的两列,并获得不同的列

时间:2019-06-20 13:00:18

标签: mysql

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

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()函数尝试使用自连接,右连接,左连接,离散列进行操作,但是一切都不对。我进行了很多搜索,但找不到答案,因此在这里谦虚地寻求帮助或建议。

2 个答案:

答案 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