2015-10-14 70 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

您需要哪种DBMS解决方案? – 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;