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

标签 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');

前几行的'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/

相关文章:

php - mysqli bind_result 仅适用于 INT 类型的列

php - MySql 连接查询在本地服务器上工作,但在实时服务器上不工作

php - 在多层成员数据库中确定 "Number of Users below"

php - 显示来自 MySQL 数据库的用户信息的配置文件页面

mysql - SQL : Error (privileges) - SET GLOBAL time_zone

MySQL group by 左连接

mysql - 获取mysql错误1054

php - 如果表单字段输入为空而不是在数据库 CodeIgniter 中更新

mysql - 如何在Mysql中向表行添加MUL键?

MySQL : Weird Characters