2011-07-12 1 views
0

"イベントリスト"ページには、今やその後に起こっているすべてのイベントがリストされています。CakePHP/MySQLのHABTM条件の多くに基づいて都市ごとの合計イベントを計算してください

ユーザは、選択した項目に一致するイベントのみを返すために照会する市区町村、イベントタイプ、イベントサブタイプなどを選択できます。

私はこの作業をうまく行っています。私は自分の入力に基づいてジョイン/コンディションなどを構築していますが、正しいイベントをページングなどに戻しています。

問題は今ある - 私は、ページの左側にある都市のリストを持っている、と(タイプ、サブtype..etcと同じ)、これらの都市でのイベントの数が欲しい - つまり:

New York (16) 
Chicago (15) 
Austin (8) 
... 

Sports (6) 
    - Baseball (2) 
    - Basketball (2) 
    - Football (0) 
Outdoors (5) 
... 

それは私が使用していることを除いて大したことないだろう、私は必要なデータを取得するために参加するので、私はこれをしようとすると:

SELECT COUNT(`VenueCity`.`id`) + COUNT(RestaurantCity.id) AS total, 
`VenueCity`.`name`, `VenueCity`.`id`, `VenueCity`.`slug`, `RestaurantCity`.`name`, 
`RestaurantCity`.`id`, `RestaurantCity`.`slug` FROM `events` AS `Event` 
INNER JOIN schedules AS `Schedule` ON (`Schedule`.`event_id` = `Event`.`id`) 
INNER JOIN dates AS `Date` ON (`Date`.`schedule_id` = `Schedule`.`id`) 
LEFT JOIN restaurants AS `Restaurant` ON (`Restaurant`.`id` = `Event`.`restaurant_id`) LEFT JOIN venues AS `Venue` ON (`Venue`.`id` = `Event`.`venue_id`) 
LEFT JOIN cities AS `VenueCity` ON (`Venue`.`city_id` = `VenueCity`.`id`) 
LEFT JOIN cities AS `RestaurantCity` ON (`Restaurant`.`city_id` = `RestaurantCity`.`id`) 
WHERE `Event`.`name` IS NOT NULL 
AND `Event`.`approval_status_id` = 1 
AND `Date`.`start` >= '2011-07-12 16:45:39' 
GROUP BY `VenueCity`.`id` 
ORDER BY `total` DESC 

それは(すなわち存在するすべての日付のカウントを返すです - 5つの日付がある10のイベントがある場合、カウントとして50を表示します。

この複雑なクエリAGAINを実行する必要はありません。すでにCakeのページネーションを2回実行した後です。そして、私がこの道を歩いていくと、すべてのタイプ、サブタイプ、サブタイプとも同じようにしなければならないと思います。

TLDR:

私はイベントSchedule->日付に基づいてイベントを取得する複雑な、MULT-結合問合せを持っています。私はまた、各都市、タイプ、サブタイプなどについて何件のイベントが起こっているか(同じクエリか新しいものか)を伝えることができるようにする必要があります。

私は交差しています指の答えは "ああ、それは簡単です、あなたはちょうど行うことができます__" - しかし、あなたが持っている助言/助けが必要です。

答えて

0

スケジュール表でサブクエリを試してみましょう。このようなものは、各イベントごとに1つのランダムな日付(おそらくテーブルに入力された最初の日付)を取得します。デバッグのビットを必要とするが、これはそこにあなたを取得する必要があります...


SELECT COUNT(`VenueCity`.`id`) + COUNT(RestaurantCity.id) AS total, 
`VenueCity`.`name`, `VenueCity`.`id`, `VenueCity`.`slug`, `RestaurantCity`.`name`, 
`RestaurantCity`.`id`, `RestaurantCity`.`slug` FROM `events` AS `Event` 
INNER JOIN 

(SELECT MIN(subSchedule.`id`) AS `id`,subSchedule.`event_id` 
    FROM `schedules` AS subSchedule 
    INNER JOIN dates AS subDate ON (subDate.`schedule_id` = subSchedule.`id`) 
    WHERE `subDate`.`start` >= '2011-07-12 16:45:39' 
    GROUP BY subSchedule.`event_id` 
) AS Schedule 

    ON (`Schedule`.`event_id` = `Event`.`id`) 

INNER JOIN dates AS `Date` ON (`Date`.`schedule_id` = `Schedule`.`id`) 
LEFT JOIN restaurants AS `Restaurant` ON (`Restaurant`.`id` = `Event`.`restaurant_id`) LEFT JOIN venues AS `Venue` ON (`Venue`.`id` = `Event`.`venue_id`) 
LEFT JOIN cities AS `VenueCity` ON (`Venue`.`city_id` = `VenueCity`.`id`) 
LEFT JOIN cities AS `RestaurantCity` ON (`Restaurant`.`city_id` = `RestaurantCity`.`id`) 
WHERE `Event`.`name` IS NOT NULL 
AND `Event`.`approval_status_id` = 1 
AND `Date`.`start` >= '2011-07-12 16:45:39' 
GROUP BY `VenueCity`.`id` 
ORDER BY `total` DESC

@Daveかもしれませんが、私はコメントすることはできていないようです、私はStackOverflowのに新たなんだからだと仮定します。しかし、基本的にサブクエリで何をしようとしているのかは、各イベントに対して1つの行を持つ疑似テーブルを作成することです。そのサブクエリの結果は、実表のようにアウト・クエリで使用されます。 event_idをグループ化し、サマリー関数を使用して他のフィールドを取得することで、必要なものを手に入れることができると思います。 MIN()は最低のschedule.idを取得し、INNER JOINをdateおよびwhere句に使用すると、where句に一致する最低のIDになります。サブクエリを個別にテストして微調整することができます。

+0

私はこれはどうなるのかに関しては困惑している - あなたが説明することができます任意のチャンス? – Dave

+0

ありがとうございます、@Bill - 私はあなたに助けていただきありがとうございます、そして、将来の問題のためにそのサブクエリを念頭に置いておきます。これは、ちょっとした微調整が必​​要だったことを示しています。 – Dave

0

私はちょっとした調整が必要でした。代わりに:だからそれはまだ都市によってグループ化しています

​​

が、カウントはイベントではなく、街に基づいています。

COUNT(`VenueCity`.`id`) + COUNT(RestaurantCity.id) AS total 

私はこれを使用していました。捕まえるのは簡単だったはずですが、 - live'n'learn! :)

コンプリートクエリ:

SELECT COUNT(DISTINCT Event.id) AS total, `VenueCity`.`name`, `VenueCity`.`id`, 
`VenueCity`.`slug`, `RestaurantCity`.`name`, `RestaurantCity`.`id`, 
`RestaurantCity`.`slug` FROM `events` AS `Event` 
INNER JOIN schedules AS `Schedule` ON (`Schedule`.`event_id` = `Event`.`id`) 
INNER JOIN dates AS `Date` ON (`Date`.`schedule_id` = `Schedule`.`id`) 
LEFT JOIN restaurants AS `Restaurant` ON (`Restaurant`.`id` = `Event`.`restaurant_id`) 
LEFT JOIN venues AS `Venue` ON (`Venue`.`id` = `Event`.`venue_id`) 
LEFT JOIN cities AS `VenueCity` ON (`Venue`.`city_id` = `VenueCity`.`id`) 
LEFT JOIN cities AS `RestaurantCity` ON (`Restaurant`.`city_id` = `RestaurantCity`.`id`) 
WHERE `Event`.`name` IS NOT NULL AND `Event`.`approval_status_id` = 1 
AND `Date`.`start` >= '2011-07-12 17:59:24' 
GROUP BY `VenueCity`.`id` ORDER BY `total` DESC 
関連する問題