2016-12-06 18 views
0

我試圖在我的項目中儘可能簡化通知系統。選擇警報類型和項目標識相同的行,並選擇多少行類似

「約翰·布朗和另外4人喜歡你的照片」

我想:

Select a.id, a.item_id, a.type u.f_name, u.l_name, count(a) 
From alerts 
Join users on a.user_id = u.u_id 
Where owner_id = {THE_USER_ID} 

但它不 「工作」


用戶表

u_id | f_name | l_name 
========================== 
234 roy  wright  
654 pam  brown 
564 kim  harris 
334 tory  plummer 
876 rick  forbes  
123 paul  nichol 
980 mario chang 
454 todd  thompson 
886 sam  richards 
215 tash  gates 
... ..... ........ 

警報表

id | item_id | type | user_id | owner_id 
=================================================== 
1   21   like  234 
2   21   comment 654 
3   32   share  876 
4   21   like  778 
5   21   like  890 
6   21   share  123 
7   54   share  454 
8   32   comment 655 
9   60   comment 886 
10  32   like  215 
..  ..   ...... ... 

結果我想

id | item_id | type | u_id | f_name | l_name | amount_more 
============================================================ 
1 21  like  234 roy  wright 2 
2 21  comment 654 pam  brown 
3 32  comment 876 rick  forbes  
6 21  share 123 paul  nichol 
7 54  share 454 todd  thompson 
9 60  comment 886 sam  richards 
10 32  like  215 tash  gates 
.. ..  ....  ... ..... ........ 
+0

在末尾添加'GROUP BY a.id,a.item_id,a.type u.f_name,u.l_name'。 – jarlh

回答

0
SELECT 
    MIN(CASE WHEN RowNumber = 1 THEN id END) as Id 
    ,item_id 
    ,type 
    ,MIN(CASE WHEN RowNumber = 1 THEN u_id END) as u_id 
    ,MIN(CASE WHEN RowNumber = 1 THEN f_name END) as f_name 
    ,MIN(CASE WHEN RowNumber = 1 THEN l_name END) as l_name 
    ,COUNT(*) - 1 as amount_more 
FROM 
    (
    SELECT 
     t.* 
     ,(@rn:= if((@item = t.item_id) AND (@type = t.type),@rn + 1, 
        if((@item:=t.item_id) AND (@type:=t.type),1,1) 
      ) 
     ) as RowNumber 
    FROM 
     (SELECT * 
     FROM 
      alerts a 
      LEFT JOIN usersTbl u 
      ON a.user_id = u.u_id 
     WHERE 
      a.owner_id = 201 
     ORDER BY 
      a.item_id 
      ,a.type 
      ,a.id) t 
     CROSS JOIN (SELECT @rn:=0,@item:=0,@type:='') var 
    ORDER BY 
     item_id 
     ,type 
     ,id 
    ) t2   
GROUP BY 
    item_id 
    ,type 
ORDER BY 
    id 
;  

所以,你需要創建一個分區的行號來確定首先考慮哪個記錄。然後使用條件聚合,你可以選擇你的用戶。這個工作在這裏檢查:http://rextester.com/VXZONO82847

+0

Hi @matt我道歉,rick forbes數量爲2的記錄應該不存在,我將編輯問題,感謝您的回答,我即將測試它 –

+0

您好@matt它的作品完美!你有沒有付費或免費檢查SQL模式和查詢? –

+0

@CheyenneForbesdeAvapno我全職工作,但以前諮詢過,並且願意接受諮詢和其他付費機會。如果需要,我很樂意與您聯繫並進一步討論。我確實在我的網站支持頁面上找到了一個Gmail地址,請讓我知道這是否是最好的聯繫方式。 – Matt

-1

在查詢您沒有使用別名A和U得當,使用此:

Select 
a.id, 
a.item_id, 
a.type, 
u.f_name, 
u.l_name, 
count(a.*) 
From alerts a Join users u 
on(a.user_id = u.u_id) 
Where owner_id = {THE_USER_ID} 
group by 1,2,3,4,5; 
+0

不需要'GROUP BY'嗎? – jarlh

+0

這會給我: '1 | 21 |像|一樣234 |羅伊|賴特| 2' 如「我想要的結果」所示 –

+0

謝謝jarlh,group by是必需的。 –