I have 3 tables, one of them is join table:
user table:
CREATE TABLE `user` (
`id`,
`name`)
media table:
CREATE TABLE `media` (
`id`,
`value`,
`type` enum('M', 'T'))
user_media table:
CREATE TABLE `user_media` (
`user_id`,
`media_id`)
I want to create a select which lets me search through user.name and media.value and return formated values.
Ex:
INSERT INTO `user` (`id`, `name`) VALUES
(1, 'Luke'),
(2, 'Vader'),
(3, 'Gregory');
INSERT INTO `media` (`id`, `value`, 'type') VALUES
(1, 'luke@mail.com', 'M'),
(2, 'skywalker@mail.com', 'M'),
(3, '123456789', 'T'),
(4, '123', 'T');
INSERT INTO `user_media` (`user_id`, `media_id`) VALUES
(1, 1),
(1, 2),
(1, 3),
(2, 4);
search: luke@mail.com
output:
userId |email |tel
1 |luke@mail.com |123456789
search: 123
output:
userId |email |tel
1 |luke@mail.com |123456789
2 |null |123
search: Gregory
output:
userId |email |tel
3 |null |null
UPDATE
SELECT u.id AS user_id,
mm.value AS mail,
mt.value AS tel
FROM USER u
LEFT JOIN user_media umt ON u.id = umt.user_id
LEFT JOIN media mt ON mt.id = umt.media_id
LEFT JOIN user_media umm ON u.id = umm.user_id
LEFT JOIN media mm ON mm.id = umm.media_id
WHERE mm.value LIKE "%luke@mail.com%"
OR mt.value LIKE "%luke@mail.com%"
OR u.name LIKE "%luke@mail.com%"
Result:
user_id mail tel
1 luke@mail.com luke@mail.com
1 skywalker@mail.com luke@mail.com
1 123456789 luke@mail.com
1 luke@mail.com skywalker@mail.com
1 luke@mail.com 123456789
II
SELECT u.id AS user_id,
mm.value AS mail,
mt.value AS tel
FROM USER u
LEFT JOIN user_media umt ON u.id = umt.user_id
LEFT JOIN media mt ON mt.id = umt.media_id AND mt.type="T"
LEFT JOIN user_media umm ON u.id = umm.user_id
LEFT JOIN media mm ON mm.id = umm.media_id AND mm.type="M"
WHERE mm.value LIKE "%luke@mail.com%"
OR mt.value LIKE "%luke@mail.com%"
OR u.name LIKE "%luke@mail.com%"
Result:
user_id mail tel
1 luke@mail.com null
1 luke@mail.com null
1 luke@mail.com 123456789
III
SELECT u.id AS user_id,
mm.value AS mail,
mt.value AS tel
FROM USER u
LEFT JOIN user_media umt ON u.id = umt.user_id
LEFT JOIN media mt ON mt.id = umt.media_id
LEFT JOIN user_media umm ON u.id = umm.user_id
LEFT JOIN media mm ON mm.id = umm.media_id
WHERE mt.type="T"
AND mm.type="M"
AND (mm.value LIKE "%Gregory%"
OR mt.value LIKE "%Gregory%"
OR u.name LIKE "%Gregory%")
Result: 0
Best Answer
You want 3 different searches and the results combined. I'd use
UNION
:Tested at SQLfiddle. (replace the
?
with the value you want to search for.)