0
SELECT events.id, events.name, events.code, event_statuses.name as event_status_name
 , regions.name as event_region_name, event_locations.name as event_location_name
 , events.date_1, events.date_2
 , count(r.id) as regs 
FROM events 
 INNER JOIN event_locations ON event_locations.id = events.event_location_id 
 INNER JOIN event_statuses ON event_statuses.id = events.event_status_id
 LEFT OUTER JOIN regions ON regions.id = events.region_id 
 LEFT OUTER JOIN registrations as r ON events.id = r.event_id and r.registration_status_id = 4 
WHERE 1 GROUP BY events.id ORDER BY date_1 DESC LIMIT 0, 50

ご覧のとおり、私のクエリには集計関数があり、イベントごとにグループ化された登録に対して実行されます。

ただし、GROUP BYこのクエリには別の集計関数がない別のクエリが必要です。ここでのポイントは、イベントリストをリージョンごとにグループ化することです。これで、イベントの並べ替えが重要になります。それらが並べ替えられている場合regs-ボストンからのすべてのイベントがまとめて表示され、次にregで並べ替えられます。したがって、別のGroupByが必要です。これは私が思いついたものですが、これも機能していません:

SELECT events.id, events.name, events.code, event_statuses.name as event_status_name
 ,regions.name as event_region_name, event_locations.name as event_location_name
 , events.date_1, events.date_2, r.regs
 FROM events 
 INNER JOIN event_locations ON event_locations.id = events.event_location_id 
 INNER JOIN event_statuses ON event_statuses.id = events.event_status_id
 LEFT OUTER JOIN regions ON regions.id = events.region_id 
 LEFT OUTER JOIN 
        (Select event_id, count(id) as regs 
        from registrations where registration_status_id = 4 
        group by event_id) r on events.id = r.event_id
 WHERE 1 GROUP BY events.region_id, events.id ORDER BY date_1 DESC LIMIT 0, 50

まだ地域ごとにグループ化することはできません。

4

3 に答える 3

1

イベントリストをリージョンごとにグループ化する必要があります。これで、イベントの並べ替えが重要になります。それらがregsでソートされている場合、ボストンからのすべてのイベントがまとめて表示され、次にregsでソートされます。

これには、GROUP BYではなく、ORDERBYが必要です。ORDER BY句の他のすべてのフィールドの前に、「まとめる」フィールドを追加できます。

ORDER BY region_id, regs
于 2012-05-10T06:41:36.793 に答える
0

これが修正版です

SELECT
  events.id,
  events.region_id,
  events.name,
  events.code,
  event_statuses.name  as event_status_name,
  regions.name         as event_region_name,
  event_locations.name as event_location_name,
  events.date_1,
  events.date_2,
  r.regs
FROM events
  INNER JOIN event_locations
    ON event_locations.id = events.event_location_id
  INNER JOIN event_statuses
    ON event_statuses.id = events.event_status_id
  LEFT OUTER JOIN regions
    ON regions.id = events.region_id
  LEFT OUTER JOIN (Select
                 event_id,
                 count(id)             as regs
               from registrations
               where registration_status_id = 4
               group by event_id) r
    on events.id = r.event_id
WHERE 1
GROUP BY events.region_id, events.id
ORDER BY date_1 DESC
LIMIT 0, 50

これを試してください私は列events.region_idのみを選択しました

于 2012-05-10T06:43:28.920 に答える
0

「一緒にまとめ」たい場合は、regに使用して集約したいように聞こえます。

SELECT 
  events.id, 
  events.name, 
  events.code, 
  event_statuses.name as event_status_name,
  regions.name as event_region_name, 
  event_locations.name as event_location_name, 
  events.date_1, 
  events.date_2, 
  SUM(r.regs) AS regs
....
GROUP BY events.region_id, events.id ORDER BY date_1 DESC LIMIT 0, 50
于 2012-05-10T06:43:42.527 に答える