に加えて、イベント(EventLocation)を拘束するために追加の列に対処するだろう
ここに一つのアイデアがあります。 (id、eventweek、eventday)のインデックスが役に立ちます。優先度(H、L、N)をinterger(例えばそれぞれ3,2,1)として保存することができれば、この値をインデックスに追加することができます。これによりさらにパフォーマンスが向上しますが、おそらく他の方法もあります...
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(ID INT NOT NULL
,EventStatus VARCHAR(12) NOT NULL
,EventDay INT NOT NULL
,EventWeek INT NOT NULL
,PRIMARY KEY(ID,EventWeek,EventDay,EventStatus)
);
INSERT INTO my_table VALUES
(1,'Normal',1,1),
(1,'Low',2,1),
(1,'High',2,1),
(1,'Normal',2,1),
(2,'Normal',1,1),
(2,'Normal',2,1),
(3,'Normal',2,1),
(3,'Low',2,1);
SELECT a.*
FROM my_table a
JOIN
(
SELECT id
, MAX(CASE eventstatus WHEN 'High' THEN 3 WHEN 'Low' THEN 2 ELSE 1 END) eventstatus
, eventday
, eventweek
FROM my_table
GROUP
BY id
, eventweek
, eventday
) b
ON b.id = a.id
AND b.eventstatus = CASE a.eventstatus WHEN 'High' THEN 3 WHEN 'Low' THEN 2 ELSE 1 END
AND b.eventweek = a.eventweek
AND b.eventday = a.eventday;
+----+-------------+----------+-----------+
| ID | EventStatus | EventDay | EventWeek |
+----+-------------+----------+-----------+
| 1 | Normal | 1 | 1 |
| 1 | High | 2 | 1 |
| 2 | Normal | 1 | 1 |
| 2 | Normal | 2 | 1 |
| 3 | Low | 2 | 1 |
+----+-------------+----------+-----------+
あなたのテーブルの行数とそれが成長する可能性があることは分かりますか?あなたのデータが比較的小さい場合は、MySQLでVIEWを作成することができます。 – WJS
その20,0000行と私はそれが毎回数百行だけ増加すると期待しています – mobcdi
これはSQLのための簡単な作業です。 (少なくとも、MySQLに関してはVIEWを作成することでここで利益が得られません。 – Strawberry