0

我有两张桌子:

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 |

这是 sqlfiddle

4

1 回答 1

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

这是两者的更新小提琴——我认为第一个在执行计划方面表现更好。

于 2013-02-21T02:54:24.007 回答