我有這個表:如何查詢多個COUNT(*)具有良好的性能
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 ------------------------- |schedule_id |date | |------------+------------| |1 |'2013-10-10'| |2 |'2013-10-20'| |3 |'2013-08-13'| ------------------------- schedule_user ----------------------------------- |schedule_user_id|schedule_id |state| |----------------+------------+-----| |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 | -----------------------------------
而且我希望有一個表是這樣的:
characteristic --------------------------------------- |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
有沒有更好的方法來執行這樣的查詢? 我應該創建一個'狀態'列索引?如果是這樣,它應該是什麼樣子?
你想要做什麼是一個支點。 – Kermit 2013-03-21 18:23:47