1

私のデータベースがどのように見えるかをいくつかのサンプルデータで示すことから始めましょう:

| id | type | id_user | date |
| 0  |  0   |   1     |   1  |
| 1  |  0   |   2     |   2  |
| 2  |  1   |   1     |   3  |
| 3  |  0   |   3     |   4  |
| 4  |  0   |   1     |   5  |
| 5  |  1   |   1     |   6  |

これが追跡しているのは、人々がグループを脱退または参加したときであり、グループに何人の人がいるかを取得しようとしています.

たとえば、このテーブルの履歴は次のようになります: (タイプ 0 = 結合、タイプ 1 = 葉)

user 1 joins at time 1
user 2 joins at time 2
user 1 leaves at time 3
user 3 joins at time 4
user 1 joins at time 5
user 1 leaves at time 6

したがって、グループ内の人数を照会する場所を指定すると、ユーザー 1 が 2 回離れており、現在グループにはユーザー 2,3 しかいないため、2 になります。

私は過去1時間半遊んでいますが、何も機能しないようです。MAX() は、正しい結果だと思うものを返さないため、本当に混乱しています (ただし、完全に間違ったことをしていることはわかっています)。

SELECT *,MAX(date) from myTable GROUP BY id_user

上記は私の現在の考えですが、私が望むものは何も与えていません。

私は PHPMyAdmin に入り、最大の日付を取得するためだけに非常に単純な MAX() を試しました (ORDER BY date DESC でそれを実行できることは知っていますが、それは私が探しているものではありません。これは単なるテストです):

SELECT *,MAX(date) from myTable

ただし、これはリストの最初の行を返します。だから私はもう少し遊んで、 D として MAX(date) を入れました。

| id | type | id_user | date | D |
| 0  |  0   |   1     |   1  | 6 |

これをグーグルで検索して、他のSOの質問を調べましたが、問題を解決するものは見つかりません。MAX で私が間違っていることを誰かが知っている場合、またはこれに対するアプローチについて提案がある場合は、本当に感謝しています。(私の質問はもっと集中的にしなければならないと感じています。) とにかく、ありがとう。

4

5 に答える 5

1

グループ内の人数を取得する最も簡単な方法は次のとおりです。

select sum(case when type = 0 then 1
                when type = 1 then -1
           end)
from myTable 

人のリストを取得するのは、もう少し難しいです。入ったが去っていない人が欲しい。おそらく、誰かが何度も出入りする可能性があります。これを解決するには、1 人あたりを数えて、その上でロジックを使用しましょう。

select id_user
from myTable
group by id_user
having sum(type = 0) > sum(type = 1)
于 2013-06-21T14:14:47.410 に答える
0

グループごとにグループが必要ですが、グループフィールドがありません。

SELECT sum( case when type = 0 then 1 else 0 end) - 
sum( type) as count_group from myTable ;
于 2013-06-21T11:41:45.607 に答える
0

あなたの質問のこの部分に少し混乱しています:

したがって、グループ内の人数を照会する場所を指定すると、ユーザー 1 が退出した (2 回) ため、3 になります。

ユーザー 1 が時間 1 に参加し、時間 3 に退室し、時間 5 に参加し、最後に時間 6 に退室するので、グループには 2 人いるはずですか? これにより、ユーザー 2 と 3 だけがグループに残ります.....

とにかく、このクエリは、現在グループにいる人の数を示します。

select count(*) as peopleInGroup
from
(
select id_user,
max(case when type = 0 then date else 0 end) as lastJoinDate,
max(case when type = 1 then date else 0 end) as lastLeaveDate
from groupLeave
group by id_user
) t
where t.lastJoinDate > t.lastLeaveDate;
于 2013-06-21T10:07:23.343 に答える
0
select count(*) as peopleingroup from(SELECT MOD(count(*), 2) as  cnt FROM `tbl_name` group by `id_user`) as main where cnt=1
于 2013-06-21T10:08:36.180 に答える