我有两个表complain
和repair
。我想从 repair
或 complain
获取 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;
关于MySql - 从表 2 中获取字段,如果没有,则从表 1 中获取字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37109350/