私はこのテーブルを持っています:
CREATE TABLE schedule (
schedule_id serial NOT NULL,
start_date date,
CONSTRAINT schedule_id PRIMARY KEY (schedule_element_id)
)
そして、このテーブル:
CREATE TABLE schedule_user (
schedule_user_id serial NOT NULL,
schedule_id integer,
state int,
CONSTRAINT fk_schedule_id FOREIGN KEY (schedule_id)
REFERENCES schedule (schedule_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
スケジュール ------------------------- |スケジュール_id |日付 | |------------+------------| |1 |'2013-10-10'| |2 |'2013-10-20'| |3 |'2013-08-13'| ------------------------- スケジュール_ユーザー ----------------------------------- |スケジュール_ユーザー_id|スケジュール_id |状態| |----------------+------------+-----| |1 | 1 |0 | |2 | 1 |1 | |3 | 1 |2 | |4 | 1 |0 | |5 | 1 |1 | |6 | 1 |1 | |4 | 2 |0 | |5 | 2 |1 | |7 | 2 |0 | |2 | 3 |1 | -----------------------------------
そして、次のようなテーブルが必要です。
特性 ------------------------------------------------------ |スケジュール_id |状態0|状態1|状態2|合計| |------------+------+------+------+-----| |1 |2 |3 |1 |6 | |2 |2 |1 |0 |3 | |3 |1 |1 |0 |2 | ------------------------------------------------------
パフォーマンスと同じくらいひどいクエリを作成しました。
SELECT
schedule.schedule_id AS id,
(( SELECT count(*) AS count
FROM schedule_user
WHERE schedule_user.schedule_id = schedule.schedule_id
AND state=0))::integer AS state0,
(( SELECT count(*) AS count
FROM schedule_user
WHERE schedule_user.schedule_id = schedule.schedule_id
AND state=1))::integer AS state1,
(( SELECT count(*) AS count
FROM schedule_user
WHERE schedule_user.schedule_id = schedule.schedule_id
AND state=2))::integer AS state2,
(( SELECT count(*) AS count
FROM schedule_user
WHERE schedule_user.schedule_id = schedule.schedule_id))::integer
AS total
FROM schedule
そのようなクエリを実行するより良い方法はありますか? 「状態」列へのインデックスを作成する必要がありますか? もしそうなら、それはどのように見えるべきですか?