0

私は2つのテーブルを持っています。(MySQL データベース) イベント:

id | title | ...

Event_participate:

event_id | user_id | confirmed

confirmed0/1 列です。指定したユーザーが参加しているイベントを探したい。私のSQLクエリは次のとおりです。

SELECT *, COALESCE(SUM(ep.confirmed), 0) AS count_members 
FROM event e
LEFT JOIN event_participate ep ON e.id = ep.event_id
GROUP BY ep.event_id
HAVING (
ep.user_id = 6
)

このクエリを拡張したいので、having clasule を使用する必要があります。私は5つのイベントの結果を持っていますが、これを照会すると:

SELECT * 
FROM  `event_participate` 
WHERE  `user_id` = 6

私は7つのレコードを持っています。そんなことがあるものか?

2 番目のテーブル (event_participate) の構造を編集しました。これは、 havingclausule を使用する理由を理解するのに役立ちます。使用するWHEREと、count_members で常に 1 になります。

編集:私の目的は、特定のユーザーが参加するイベントを取得することです。これらのイベントに既に参加しているユーザーの数を知りたいです。

例: user id=6 は id=1 の 1 つのイベントに参加します。しかし、イベント id=1 に参加しているユーザーは他に 3 人います。したがって、1 つのイベントを取得し、列 count_members で取得する必要があります4

4

4 に答える 4

0

また、クエリを修正してみます:

SELECT * 
FROM event e
LEFT JOIN event_participate ep ON e.id = ep.event_id
GROUP BY ep.event_id, ep.user_id
HAVING (
ep.user_id = 6
)

このクエリの GROUP BY 句は冗長であり、HAVING を WHERE に置き換えることができることに注意してください。

于 2012-06-21T16:22:42.057 に答える
0

having 句を where 句に変更する必要があります。having 句は group-by 列または集計を使用していないため、「any(user_id) = 6」を実行しています。

SELECT *
FROM event e LEFT JOIN event_participate ep ON e.id = ep.event_id
WHERE ep.user_id = 6
GROUP BY ep.event_id 

あなたの編集に基づいて、次のようなものが必要だと思います:

SELECT ep.event_id, COALESCE(SUM(ep.confirmed), 0) AS count_members
FROM event e LEFT JOIN event_participate ep ON e.id = ep.event_id
GROUP BY ep.event_id 
HAVING max(case when ep.user_id = 6 then 1 else 0 end) = 1

他のすべてのメンバーを数えながら、少なくとも 1 つの user_id = 6 を持つイベントに人口を制限しようとしています。

于 2012-06-21T16:15:08.663 に答える
0

指定したユーザーが参加しているイベントを探したい。

SELECT e.title 
FROM event e
  JOIN event_participate ep ON e.id = ep.event_id
WHERE
  ep.user_id = 6;

GROUP BY句を使用する必要はありません。データを集計していません。

于 2012-06-21T16:35:52.543 に答える
0

これから始めてみてください:

SELECT e.*
FROM event e 
INNER JOIN event_participate ep 
    ON e.id = ep.event_id AND ep.user_id = 6
于 2012-06-21T16:19:13.137 に答える