0

通知システムを実装しています。私のテーブル構造はこのようなものです..

id (自動インクリメントの主キー)
user_id (通知を表示するユーザーのユーザー ID 、int) trigger_by (
通知をトリガーしたユーザー、int)
post_id (通知が存在する投稿、int)
type (通知のタイプ) , int)
seen (通知を読んだか、bool)

通知を表示済みとしてマークするときは、post_id とタイプを使用しています。つまり、最大の ID を持つ行が表示された場合、その post_id とタイプの以前のすべての行が表示されると安全に想定できます。

ここで、その post_id と type の以前のエントリと組み合わせた行と、その post_id と type に登録されている行の数を取得したいと考えています。私の現在のクエリは

select max(x.id) as id, 
   x.post_id as post_id, 
   x.seen as seen, 
   x.user_id as user_id, 
   x.triggered_by as triggered_by, 
   x.type as type, 
   x.count as count
from (SELECT notification.id, 
       notification.post_id, 
       notification.user_id, 
       notification.triggered_by, 
       notification.type, 
       c.count,  notification.seen 
     FROM `notification`
         join (select post_id, type, count(id) as count 
               from notification group by post_id, type) c 
           on c.type=notification.type 
             and c.post_id=notification.post_id 
     Where notification.user_id=1) x 
Group by post_id 
Order by id desc limit 10

このクエリの問題は、最も外側のクエリの 'group by' 句がランダムな行の 'seen' 列を返していることです。ここで、最大の ID を持つ行からカウントする以外のデータを返す必要があります。

4

1 に答える 1

0

これを試して:

 Select id, post_id, seen,
    user_id, triggered_by, type, 
   (Select Count(*) From notification
    Where type = N.Type
      And post_id = n.post_id) Count
 From Notification n
 where user_id = 1
 Order by id desc limit 10

「そのpost_idとtypeの以前のエントリと組み合わせる」とはどういう意味ですか?? このクエリで、ソース テーブルのさまざまな行の値を 1 行の出力に結合したいということですか? ある行から post_id を取得するのと同様に、以前の別の行から Triggered_By を取得しますか?

于 2013-03-20T19:06:23.720 に答える