2016-07-13 2 views
0

у меня есть две таблицы и структуры здесь:MySql, объединять таблицы WHERE IN()

CREATE TABLE `users` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `username` varchar(50) NOT NULL, 
    `membership` varchar(12) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 


CREATE TABLE `memberships` (
    `id` int(1) unsigned NOT NULL AUTO_INCREMENT, 
    `title` varchar(30) NOT NULL DEFAULT '', 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 



INSERT INTO `memberships` (`id`, `title`) VALUES 
(1, 'Basic'), 
(2, 'Bronze'), 
(3, 'Gold'), 
(4, 'Platinum'); 

INSERT INTO `users` (`id`, `username`, `membership`) VALUES 
(1, 'john', '0'), 
(2, 'mike', '1,2'), 
(3, 'peter', '3,4'), 
(4, 'jane', '3'), 
(5, 'rick', '1,2,3'); 

мне нужно соединить обе таблицы и список всех пользователей с их помощью членства IN функции.

Это то, что я пытался, но я не могу присоединиться к таблицам, что путь:

SELECT 
    *.u 
    m.title AS title 
FROM 
    `users` AS u 
    LEFT JOIN `memberships` AS m 
    WHERE m.id IN(u.membership) 
ORDER BY u.username; 

То, что я хотел бы иметь что-то вроде этого:

username    membership 
===================================== 
john     null 
mike     Basic, Bronze 
peter     Gold, Platinum 
jane     Gold 
rick     Basic, Bronze, Gold 

Я создал SQL скрипта: http://sqlfiddle.com/#!9/39b6e1

+0

'ВЫБРАТЬ и *' не '* .u' – RiggsFolly

ответ

0

Как насчет этого?

SELECT 
    u.*, 
    GROUP_CONCAT(m.title SEPARATOR ', ') as memberships 
FROM 
    `users` AS u 
    LEFT JOIN `memberships` AS m 
    ON FIND_IN_SET(m.id, u.membership) 
GROUP BY u.username 
ORDER BY u.username 

Дает:

id username membership memberships 
4 jane  3   Gold 
1 john  0   (null) 
2 mike  1,2   Bronze, Basic 
3 peter  3,4   Gold, Platinum 
5 rick  1,2,3  Basic, Bronze, Gold 

Updated SQL Fiddle

+0

Разве это не сложный способ делать то, что' FIND_IN_SET() 'делает. ? – Barmar

+0

Спасибо @Barmar. Я не знал о 'FIND_IN_SET()'. Обновлен ответ, чтобы использовать его. –

+0

@Miro Markaravanes благодарю вас работает отлично. Я принял ваш ответ. – Alko