我有两张桌子:
CREATE TABLE `events` (
`id` double NOT NULL,`value` int, PRIMARY KEY (`id`));
CREATE TABLE `updates` (
`id` double NOT NULL AUTO_INCREMENT,
`action` enum('delete','update') DEFAULT NULL,
`event_id` double DEFAULT NULL,
PRIMARY KEY (`id`));
尝试进行查询,从events
获取所有值并从更新获取值,即使事件表中不存在更新中的event_id
(仅当操作为'删除'时才可能)
使用
SELECT ifnull(e.id,u.event_id) AS event_id,
e.value,ifnull(u.action,'update') AS ACTION,
ifnull(u.id,-1) as update_id
FROM events e
LEFT JOIN updates u ON e.id=u.event_id
我得到了
| EVENT_ID | VALUE | ACTION | UPDATE_ID |
----------------------------------------------
| 1361264148710 | 1 | update | -1 |
| 1361264148711 | 2 | update | -1 |
| 1361264148712 | 5 | update | -1 |
| 1361264148713 | 10 | update | 1 |
| 1361264148714 | 11 | update | 2 |
| 1361264148714 | 11 | update | 3 |
| 1361264148714 | 11 | update | 4 |
| 1361264148715 | 14 | update | 5 |
| 1361264148716 | 1 | update | 6 |
| 1361264148717 | 17 | update | 8 |
| 1361264148718 | 22 | update | 10 |
| 1361264148719 | 23 | update | 11 |
我的目标是获得:
| EVENT_ID | VALUE | ACTION | UPDATE_ID |
-----------------------------------------------
| 1361264148710 | 1 | update | -1 |
| 1361264148711 | 2 | update | -1 |
| 1361264148712 | 5 | update | -1 |
| 1361264148713 | 10 | update | 1 |
| 1361264148714 | 11 | update | 2 |
| 1361264148714 | 11 | update | 3 |
| 1361264148714 | 11 | update | 4 |
| 1361264148715 | 14 | update | 5 |
| 1361264148716 | 1 | update | 6 |
| 1361264148708 | (null) | delete | 7 |
| 1361264148717 | 17 | update | 8 |
| 1361264148709 | (null) | delete | 9 |
| 1361264148718 | 22 | update | 10 |
| 1361264148719 | 23 | update | 11 |
答案 0 :(得分:0)
您希望UNION
得出结果:
SELECT ifnull(e.id,u.event_id) AS event_id,
e.value,ifnull(u.action,'update') AS ACTION,
ifnull(u.id,-1) as update_id
FROM events e
LEFT JOIN updates u ON e.id=u.event_id
UNION
SELECT u.event_id AS event_id,
e.value,ifnull(u.action,'update') AS ACTION,
ifnull(u.id,-1) as update_id
FROM updates u
LEFT JOIN events e ON e.id=u.event_id
WHERE e.id IS NULL
您的更新小提琴:http://sqlfiddle.com/#!2/b1eb7/7
正如@njk在评论中指出的那样,这可以简化为:
SELECT ifnull(e.id,u.event_id) AS event_id,
e.value,ifnull(u.action,'update') AS ACTION,
ifnull(u.id,-1) as update_id
FROM
(SELECT id AS id FROM events
UNION
SELECT event_id AS id FROM updates) a
LEFT JOIN events e ON e.id = a.id
LEFT JOIN updates u ON u.event_id = a.id
ORDER BY update_id
这两个都是updated Fiddle - 我认为第一个更好地看待执行计划。