2013-04-11 2 views
0

Предположим, у меня эти три таблицы: пользователи, категории и users_categories (многие-ко-многим).Как сделать внутреннее соединение, сохраняя другие столбцы для group_concat?

Я пытаюсь получить всех пользователей и их категорий, так что это было бы что-то вроде этого:

SELECT users.*, GROUP_CONCAT(DISTINCT categories.name separator '/') clist 
FROM users 
LEFT JOIN users_categories ON users_categories.user = users.id 
LEFT JOIN categories ON categories.id = users_categories.category 

Довольно просто. Теперь, твердая часть, я хочу отобразить всех пользователей, которые находятся в определенной категории, но все равно сохраняют тот же список категорий в GROUP_CONCAT. Делая следующий запрос показывает только пользователей в той или иной категории, как и ожидалось, но обрезает остальные категории он принадлежит в:

SELECT users.*, GROUP_CONCAT(DISTINCT categories.name separator '/') clist 
FROM users 
LEFT JOIN users_categories ON users_categories.user = users.id 
LEFT JOIN categories ON categories.id = users_categories.category 
INNER JOIN categories cmust ON cmust.id = categories.id AND cmust.name = 'categoryhere' 

Как бы я изменить этот последний запрос? Благодарю.

EDIT: Выборочные данные с только названиями колонок:

ПОЛЬЗОВАТЕЛЕЙ стол:

id, name: 
1, myname 
2, anothername 
3, hisname 

ТАБЛИЦЫ:

id, name 
1, music 
2, art 
3, sports 

USERS_CATEGORIES стол:

user, category 
1,1 
1,2 
2,2 
3,1 
3,3 
3,2 

Желаемая QUER y без категории поиска (как в моем первом запросе):

users.id,users.name,clist 
1,'myname','music/art' 
2,'anothername','art' 
3,'hisname','music/sports/art' 

Желаемый результат запроса С категорией поиска. Скажем, только пользователи в категории «музыка». users.id, users.name, CLIST

1,'myname','music/art' 
3,'hisname','music/sports/art' 

Это последнее, что я хочу сделать. Я просто хочу удалить пользователей NOT в указанной категории и сохранить остальные категории, к которым они принадлежат.

+0

Можете ли вы разместить образцы данных, пожалуйста? – Rachcha

+0

данные образца и желаемые результаты –

+0

@echo_me Просто добавлены некоторые примеры данных, спасибо. –

ответ

0

вы можете посмотреть на этот

SELECT users.*, GROUP_CONCAT(DISTINCT categories.name separator '/') clist 
    FROM users 
    LEFT JOIN users_categories ON users_categories.user = users.id 
    LEFT JOIN categories ON categories.id = users_categories.category 
    group by users.id 

DEMO HERE

, и если вы хотите получить категории с категории поиска вы можете сделать это

SELECT users.*, GROUP_CONCAT(DISTINCT categories.name separator '/') clist 
FROM users 
LEFT JOIN users_categories ON users_categories.user = users.id 
LEFT JOIN categories ON categories.id = users_categories.category 
group by users.id 
having GROUP_CONCAT(DISTINCT categories.name separator '/') like '%music%' 

DEMO HERE

0

Вы можете просто использовать следующий код:

SELECT * 
    FROM (
SELECT users.*, GROUP_CONCAT(DISTINCT categories.name separator '/') clist 
    FROM users 
     LEFT JOIN users_categories ON users_categories.user = users.id 
     LEFT JOIN categories ON categories.id = users_categories.category 
     ) a 
WHERE '/'+a.clist+'/' LIKE '/'+'categoryhere'+'/'; 

Примечание: Используйте правильный MySQL оператор конкатенации строк в строке в пункте WHERE. Это даст вам желаемый результат.

+0

Это сработает, но поскольку в 'clist' может быть несколько категорий, я думаю, что просто совпадение - это довольно грубая работа. Нет ли прямого метода, который бы использовал меньше накладных расходов? Кроме того, см. Мой оригинальный пост, я добавил примеры данных. Благодарю. –

0

Вы можете получить результат, который вы хотите, начиная с de затем найдите пользователей в этой/этой категории (и), а затем продолжите, как в исходном запросе.

Преимущество этого метода заключается в том, что вы можете легко искать более одной категории сразу, i.e поиск например пользователи, относящиеся к категориям музыка или искусство.

SELECT users.*, GROUP_CONCAT(DISTINCT categories.name separator '/') clist 
FROM categories C1 
INNER JOIN users_categories UC1 ON UC1.category = C1.id 
INNER JOIN users ON users.id = UC1.user 
INNER JOIN users_categories ON users_categories.user = users.id 
INNER JOIN categories ON categories.id = users_categories.category 
WHERE C1.name IN ('music') 
group by users.id 
Смежные вопросы