首页 > 解决方案 > 优先选择查询

问题描述

我们试图解决的问题最好通过以下说明性示例来说明:

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 的值选择我们的结果colAtable_1但如果那没有返回结果,我们想根据 in 的值返回我们的colY结果table_2。换句话说 SELECTing fromtable_2是 SELECTing from 的备份table_1NULL仅当两个表都不满足条件时,查询才会返回。

伪 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

请提出以下解决方案:

  1. 利用最新的数据库功能(供后代使用)
  2. 使用 MySQL 版本5.6.51(对于我们的应用程序)

标签: mysqlmariadb

解决方案


编写一个子查询来生成I您想要的所有行。

然后将这与两个表左连接,并使用IFNULLtable_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

推荐阅读