0

私はこのクエリを持っています:

SELECT a.*, b.id AS host_id, COUNT(c.event_id) AS count_joins, COUNT(d.event_id) AS joined
FROM (`events` AS a)
INNER JOIN `users` AS b ON `b`.`id` = `a`.`host_id`
LEFT JOIN `joins` AS c ON `c`.`event_id` = `a`.`id`
LEFT JOIN `joins` AS d ON `d`.`event_id` = `a`.`id` AND d.user_id = 1
WHERE `a`.`date` > '1000-10-10 10:10:10'
GROUP BY `a`.`id`
ORDER BY `a`.`date` ASC
LIMIT 20

すべてのイベント、作成者、参加数を取得し、現在のユーザー(id = 1)がイベントに参加したかどうかを確認します。

ユーザーがイベントに参加したかどうかを確認するのに問題があります。ユーザーが参加した場合は1、参加していない場合は0ではなく、参加数が返されます。

4

2 に答える 2

0

問題は、a、b、c、dを同時に結合していることだと思います。したがって、誰かが各イベントに参加するたびに1つのレコード(a×c)を取得し、次にユーザー番号1のレコード((a×c)×d)に参加しますしたがって、テーブルが次のようになっている場合

イベント:{e1、e2}結合:{(e1、u1)、(e1、u2)、(e1、u3)、(e2、u2)、(e2、u4)}

クエリ(集計関数の前)は

{(e1、u1、u1)、(e1、u2、u1)、(e1、u3、u1)、(e2、u2、null)、(e2、u4、null)}

あなたはおそらくどちらかによってあなたが求めているものを手に入れることができます

  • x cで集計を実行してから、「joinsasd」テーブルに結合します
  • たとえば、「c」に合成フィールドを含めてから、select句c.user_id == 1 as is_user_1を取りますmax( is_user_1 )
于 2012-07-03T07:45:34.283 に答える
0

これを試してみてください:

SELECT a.*, b.id AS host_id, 
SUM(CASE WHEN c.event_id IS NOT NULL THEN 1 ELSE 0 END) AS count_joins, 
SUM(CASE WHEN c.event_id IS NOT NULL AND c.user_id = 1 THEN 1 ELSE 0 END) AS joined
FROM (`events` AS a)
INNER JOIN `users` AS b ON `b`.`id` = `a`.`host_id`
LEFT JOIN `joins` AS c ON `c`.`event_id` = `a`.`id`
WHERE `a`.`date` > '1000-10-10 10:10:10'
GROUP BY `a`.`id`
ORDER BY `a`.`date` ASC
LIMIT 20
于 2012-07-03T08:46:50.443 に答える