Working With MySQL Unions

working with mysql unions

MySQL unions used to combine the results of multiple SELECT statements into one result. MySQL supports both UNION and UNION ALL for joining SELECT results.

Before learning to use UNION, We need to create tables and records to work with. Just run the following SQL statement.

CREATE TABLE `other_users` (
   `id` int(11) not null,
   `username` varchar(50) not null,
   `email` varchar(100) not null,
   `status` enum('1','2','3') not null default '1',
   PRIMARY KEY (`id`),
   UNIQUE KEY (`username`),
   UNIQUE KEY (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `other_users` (`id`, `username`, `email`, `status`) VALUES 
('1', 'helen', '[email protected]', '1'),
('2', 'jenny', '[email protected]', '1'),
('3', 'maya', '[email protected]', '2'),
('4', 'selen', '[email protected]', '3'),
('5', 'owlif', '[email protected]', '1');

CREATE TABLE `other_users_meta` (
   `id` int(11) not null auto_increment,
   `user_id` int(11) not null,
   `key` varchar(50) not null,
   `value` varchar(200) not null,
   PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=11;

INSERT INTO `other_users_meta` (`id`, `user_id`, `key`, `value`) VALUES 
('1', '1', 'visits', '58'),
('2', '2', 'visits', '30'),
('3', '3', 'visits', '600'),
('4', '4', 'visits', '405'),
('5', '5', 'visits', '275'),
('6', '1', 'book', 'learn wp'),
('7', '2', 'book', 'learn laravel'),
('8', '3', 'book', 'learn design'),
('9', '4', 'book', 'learn develop'),
('10', '5', 'book', 'learn dash');

CREATE TABLE `users` (
   `id` int(11) not null,
   `username` varchar(50) not null,
   `email` varchar(100) not null,
   `status` enum('1','2','3') not null default '1',
   PRIMARY KEY (`id`),
   UNIQUE KEY (`username`),
   UNIQUE KEY (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `users` (`id`, `username`, `email`, `status`) VALUES 
('1', 'hjohn', '[email protected]', '1'),
('2', 'mark', '[email protected]', '1'),
('3', 'marl', '[email protected]', '2'),
('4', 'kim', '[email protected]', '3'),
('5', 'taylor', '[email protected]', '1');

CREATE TABLE `users_meta` (
   `id` int(11) not null auto_increment,
   `user_id` int(11) not null,
   `key` varchar(50) not null,
   `value` varchar(200) not null,
   PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=11;

INSERT INTO `users_meta` (`id`, `user_id`, `key`, `value`) VALUES 
('1', '1', 'visits', '52'),
('2', '2', 'visits', '300'),
('3', '3', 'visits', '60'),
('4', '4', 'visits', '40'),
('5', '5', 'visits', '245'),
('6', '1', 'book', 'learn php'),
('7', '2', 'book', 'learn perl'),
('8', '3', 'book', 'learn seo'),
('9', '4', 'book', 'learn js'),
('10', '5', 'book', 'learn css');

Well. Let’s select user data and user meta data for user exist in users table and join result with user data and user meta data for user exist in other_users table.

mysql> SELECT u.username, u.email, m.value
    -> FROM users u
    -> INNER JOIN users_meta m ON u.id=m.user_id
    -> WHERE u.id=1 AND m.key='visits'
    -> UNION
    -> SELECT ou.username, ou.email, om.value
    -> FROM other_users ou
    -> INNER JOIN other_users_meta om ON ou.id=om.user_id
    -> WHERE ou.id=1 AND om.key='visits';
+----------+-------------------+-------+
| username | email             | value |
+----------+-------------------+-------+
| hjohn    | [email protected]  | 52    |
| helen    | [email protected] | 58    |
+----------+-------------------+-------+
2 rows in set (0.00 sec)

For valid UNION statement, All select statements must select the same columns. By default UNION remove any duplicates while the the UNION ALL return all rows. To better understand the difference, check the following examples.

mysql> SELECT u.username, u.email, m.value
-> FROM users u
-> INNER JOIN users_meta m ON u.id=m.user_id
-> WHERE u.id<3 AND m.key='visits' -> UNION
-> SELECT u.username, u.email, m.value
-> FROM users u
-> INNER JOIN users_meta m ON u.id=m.user_id
-> WHERE u.id<1 AND m.key='visits'; +----------+------------------+-------+ | username | email | value | +----------+------------------+-------+ | hjohn | [email protected] | 52 | | mark | [email protected] | 300 | +----------+------------------+-------+ 2 rows in set (0.00 sec)[/sql]

mysql> SELECT u.username, u.email, m.value
-> FROM users u
-> INNER JOIN users_meta m ON u.id=m.user_id
-> WHERE u.id<3 AND m.key='visits' -> UNION ALL
-> SELECT u.username, u.email, m.value
-> FROM users u
-> INNER JOIN users_meta m ON u.id=m.user_id
-> WHERE u.id<3 AND m.key='visits'; +----------+------------------+-------+ | username | email | value | +----------+------------------+-------+ | hjohn | [email protected] | 52 | | mark | [email protected] | 300 | | hjohn | [email protected] | 52 | | mark | [email protected] | 300 | +----------+------------------+-------+ 4 rows in set (0.00 sec)[/sql]