I have two tables :
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`));
And trying to make query which will get all values from events and get values from updates, even if event_id in updates do not exist in events table (only possible if action is ‘delete’)
using
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
I getting
| 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 |
my goal is to get:
| 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 |
Looks like you want to
UNIONyour results:And your updated fiddle: http://sqlfiddle.com/#!2/b1eb7/7
As @njk pointed out in the comments, this can be reduced to:
Here is the updated Fiddle with both — I think the first performs better looking at the execution plans.