mysql - 优先选择查询
问题描述
我们试图解决的问题最好通过以下说明性示例来说明:
CREATE TABLE table_1
(
id INT UNSIGNED AUTO_INCREMENT,
colA INT,
colB VARCHAR(10),
PRIMARY KEY(id)
);
CREATE TABLE table_2
(
id INT UNSIGNED AUTO_INCREMENT,
colY INT,
colZ VARCHAR(10),
PRIMARY KEY(id)
);
INSERT INTO table_1(colA, colB) VALUES(1, 'NPD5A6V9EI'), (2, 'ISO4IK42YQ'), (4, 'J12QAN4O42'), (6,'V8YTZFHCU4');
INSERT INTO table_2(colY, colZ) VALUES(3, 'RBUNWLO753'), (4, 'X2BCEY7O8B'), (5, 'BNUS7R4225'), (6, '72NOWCTH5G');
我们想根据 in 的值选择我们的结果colA
,table_1
但如果那没有返回结果,我们想根据 in 的值返回我们的colY
结果table_2
。换句话说 SELECTing fromtable_2
是 SELECTing from 的备份table_1
。NULL
仅当两个表都不满足条件时,查询才会返回。
伪 SQL 查询可以是:
SELECT colB FROM table_1 where colA = 3 OR SELECT colZ FROM table_2 where colY = 3;
查询应基于以下 I/O 表返回输出:
I O
= =
1 NPD5A6V9EI -- From table_1
2 ISO4IK42YQ -- From table_1
3 RBUNWLO753 -- From table_2
4 J12QAN4O42 -- From table_1 (has precedence over table_2 entry)
5 BNUS7R4225 -- From table_2
6 V8YTZFHCU4 -- From table_1 (has precedence over table_2 entry)
9 NULL
请提出以下解决方案:
- 利用最新的数据库功能(供后代使用)
- 使用 MySQL 版本
5.6.51
(对于我们的应用程序)
解决方案
编写一个子查询来生成I
您想要的所有行。
然后将这与两个表左连接,并使用IFNULL
从table_1
优先级中获取匹配值table_2
。
SELECT ids.id AS I, IFNULL(t1.colB, t2.colZ) AS O
FROM (SELECT 1 AS id UNION ALL SELECT 2 UNION ALL SELECT 3 ... UNION ALL SELECT 9) AS ids
LEFT JOIN table_1 AS t1 ON t1.colA = ids.id
LEFT JOIN table_2 AS t2 ON t2.colY = ids.id
ORDER BY ids.id
推荐阅读
- python - 哪些是现代的 glTranslate 和 glRotate 替代品?
- java - 任务':html:draftCompileGwt'的libGDX执行失败
- python - 获取pandas解析时跳过的空行数
- r - 当 R 中存在字符时,R- grepl 不匹配字符。(UTF-8 编码)
- mongodb - 什么 Mongodb 模式和集合对我的大学应用程序中的三个嵌套级别有好处
- visual-studio-code - 如何在 Visual Studio 代码中显示元素的路径?
- angular - 在功能模块中导入 HttpClientModule
- python - 将本地 unix 时间转换为 UTC unix 时间的问题
- image - 如何解决“ValueError:找到昏暗 4 的数组。估计器预期 <= 2。”?
- r - 将向量的所有元素乘以R中for循环中的每个元素