我有这张桌子:
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
)
日程 ------------------------- |schedule_id |日期 | |------------+------------| |1 |'2013-10-10'| |2 |'2013-10-20'| |3 |'2013-08-13'| ------------------------- schedule_user ---------------------------------- |schedule_user_id|schedule_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 | ----------------------------------
我想要一张这样的桌子:
特征 -------------------------------------- |schedule_id |state0|state1|state2|total| |------------+------+------+------+-----| |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
有没有更好的方法来执行这样的查询?我应该创建一个“状态”列的索引吗?如果是这样,它应该是什么样子?