连接所有表中的值;

时间:2013-02-21 02:51:03

标签: mysql join

我有两张桌子:

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 |

here is sqlfiddle

1 个答案:

答案 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 - 我认为第一个更好地看待执行计划。