MySql - 从表 2 中获取字段,如果没有,则从表 1 中获取字段

标签 mysql

我有两个表complainrepair。我想从 repaircomplain 获取 ass_to_per [最新一个](如果 complain 的 id) 不存在于修复中。

说明:

我想从 complain 表以及 repair 表中获取 ass_to_per。但它们之间是有关系的,在repair中有一个名为com_id的字段,它是一个外键。因此,我想从 complain 获取 ass_to_per ,并检查外键的repair(如果有),然后检查 ass_to_per 修复。如果有的话就得到它的结果。

我有sqlfiddle,用于在线测试:sqlfiddle.com

下表和数据如下。

投诉

CREATE TABLE `complain` (
  `id` int(11) NOT NULL,
  `ass_to_per` varchar(50) NOT NULL
);
INSERT INTO `complain` (`id`, `ass_to_per`) VALUES
(1, 'frayne'),
(2, 'murad'),
(4, 'frayne'),
(5, 'murad'),
(6, 'frayne'),
(7, 'frayne');

修复

CREATE TABLE `repair` (
  `id` int(11) NOT NULL,
  `com_id` int(11) NOT NULL,
  `ass_to_per` varchar(50) NOT NULL
);
INSERT INTO `repair` (`id`, `com_id`, `ass_to_per`) VALUES
(1, 1, 'frayne'),
(2, 1, 'murad'),
(3, 4, 'frayne'),
(4, 6, 'murad'),
(5, 2, 'murad'),
(6, 5, 'frayne');

我的查询:

SELECT * FROM `complain` 
WHERE `id` IN (SELECT DISTINCT(`com_id`) FROM `repair` WHERE `ass_to_per` = 'frayne') OR `ass_to_per`='frayne'    

查询结果

id |    ass_to_per
--------------
1  |    frayne
4  |    frayne
5  |    murad
6  |    frayne
7  |    frayne

分析

id | ass_to_per[complain] | ass_to_per[repair]
--------------
1  |    murad             |    frayne
2  |    murad             |    murad
4  |    frayne            |    frayne          //need this one
5  |    murad             |    frayne          //need this one
6  |    frayne            |    murad
7  |    frayne            |                    //need this one

预期结果:

id |    ass_to_per
--------------
4  |    frayne        //ass_to_per from repair
5  |    frayne        //ass_to_per from repair
7  |    frayne        //ass_to_per from complain

最佳答案

COALESCE() 将输出它找到的第一个非空参数,因此使用联接,您可能可以从投诉或修复中获取 ass_to_per,具体取决于哪个参数存在:

SELECT 
    complain.id, 
    COALESCE(repair3.ass_to_per, complain.ass_to_per) as ass_to_per
FROM complain
LEFT JOIN 
    (SELECT max(id) as maxid, com_id FROM repair GROUP BY com_id) as repair2 
    ON complain.id = repair2.com_id
LEFT JOIN repair as repair3
    ON repair2.maxid = repair3.id
GROUP BY complain.id

如果您想在计算的 ass_to_per 上进一步过滤(如“frayne”的示例),只需将此选择嵌入为子查询:

SELECT * 
FROM (
  SELECT 
    complain.id, 
    COALESCE(repair3.ass_to_per, complain.ass_to_per) as ass_to_per
  FROM complain
  LEFT JOIN (SELECT max(id) as maxid, com_id FROM repair GROUP BY com_id) AS repair2 
    ON complain.id = repair2.com_id
  LEFT JOIN repair as repair3
    ON repair2.maxid = repair3.id
  GROUP BY complain.id
) AS mydata 
WHERE mydata.ass_to_per = 'frayne'
ORDER BY mydata.id;

在这里摆弄:http://sqlfiddle.com/#!9/33433/49

关于MySql - 从表 2 中获取字段,如果没有,则从表 1 中获取字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37109350/

相关文章:

mysql - 子查询获取最后一条记录

mysql - 如何检查 Mysql 数据库中是否存在精确的 slug(单次出现或多次出现)?

Mysql统计外键的不同id

php - 我如何以正确的格式获取这些数据?

mysql - mysql中使用通配符计算最大记录数

php - 通过 Codeigniter 中的三个不同表获取数据的子查询是什么?

mysql - 这个 MySQL 语法有什么问题?

mysql - 删除表中的部分字符串

php - 更新两个字段对的值返回奇怪的值

php - 酒店商店定位器的距离计算查询不起作用