2015-10-14 2 views
0

У меня есть две таблицы:SQL запрос с использованием GROUP_CONCAT() функция

1.Activity-- which stores all the activities from a user 
2.User-- which stores all the registered users 

Я хочу получать все сообщения и любит всех сообщений в одном запросе. Строка - это сообщение или подобное, определяется значением типа.

Имя таблицы - активность

| actId | parentId | type  | postedby | 
--------------------------------------------------- 
| 100 | NULL  | post  | 100   | 
| 200 | 100  | like  | 200   | 
| 300 | 100  | like  | 300   | 
| 400 | 100  | like  | 400   | 
| 500 | NULL  | post  | 100   | 
| 600 | 500  | like  | 600   | 

Имя таблицы - Пользователь

| userId | name | 
------------------- 
| 100  | Amit | 
| 200  | Alok | 
| 300  | Arjun | 
| 400  | Arpeet | 
| 600  | Amaan | 

Выход должен быть

| actId | name | LikedBy   | 
------------------------------------------ 
| 100 | Amit | Alok, Arjun, Arpeet| 
| 500 | Amit | Amaan    | 

ПРИМЕЧАНИЕ - Я не хочу, чтобы это достигалось с помощью FOR XML PATH, так как он не поддерживается в SQLite, над которым я работаю.

Моя попытка запроса была

SELECT a.id, u.name, 
(select group_concat(u.name) from activity a, user u where a.id = u.id and a.type = 'like' 
group by a.parent) as likedby 
FROM activity a, user u 
WHERE a.id = u.id and a.type = 'post' 

В результате я получил

| Id | name | LikedBy   | 
--------------------------------------- 
| 100 | Amit | Alok, Arjun, Arpeet| 

Вы можете видеть, что другой ряд не хватало результата.

+2

Для какой СУБД вам нужно решение? – Jens

+0

@Jens, мне это нужно для SQLite. Но это может быть не так много, поскольку запрос будет почти таким же. –

+0

это неправда, GROUP_CONCAT() - связанная с mysql функция, в SQL Server это рекурсивный CTE (например). – Pred

ответ

1

Попробуйте это:

select t.id4id Id, n1.Name Name, group_concat(n2.name) Groups 
from (select t1.actid id4id, t1.postedby id4name, t2.postedby id4groups 
     from Activity t1 join Activity t2 on t1.actid = t2.parentid) t join "user" n1 on t.id4name = n1.userid join "User" n2 on t.id4groups = n2.userid 
group by id4id 

Примечания: 1. Я полагаю, что сообщение всегда будет иметь нулевое значение в родительских

+0

Большое спасибо за ваш ответ. Трудно понять. Но все же я буду использовать его с тех пор, как он работает для меня в соответствии с моим требованием. –

0

Вам не нужно подзапрос для этого. Вам просто нужно два присоединяется, чтобы получить значения для исходного имени и понравившегося имя:

select a.parentid, u.name, group_concat(ul.name separator ', ') as likedby 
from activity a join 
    user ul 
    on a.postedby = ul.userid join 
    user u 
    on a.parentid = u.userid 
where a.type = 'like'; 

группы по a.parentid, u.name;

Смежные вопросы