これが状況です。1つはアイテムのリストを含み、もう1つはそれらのアイテムに対して行われた入札のリストを含む2つのテーブルです。ここで、実際の価格でアイテムの詳細を知る必要があります。つまり、入札が行われた場合、現在の価格を取得するには、このアイテムの入札リストから最も高い値を知る必要があります。アイテムの量をフィルタリングするために適用される他のルールがある状況がありますが、基本的にはこれに帰着します:
SELECT i . * , IFNULL( GREATEST( b.`made_bid` , `start_bid` ) , `start_bid` ) AS current_price
FROM `items` i
LEFT JOIN (
SELECT `bid_list`.`item_id` , MAX( `made_bid` ) AS made_bid
FROM `bid_list`
WHERE (
bid_status =1
)
GROUP BY `item_id`
)b ON b.item_id = i.id
そして、これが私の問題です。これは機能しますが、データベースに入力されるアイテムが増え、入札が増えるため、bid_listが大きくなるため、速度が低下します。
このクエリを作成するためのより良い方法はありますか、それともここでの最善の方法は、現在の最高入札額をアイテムテーブルの追加の列に入力し、入札が行われるたびに更新することです。どういうわけか、同じ情報を2回ストックするので、それは間違っていると感じます。
これに関する助けをいただければ幸いです。
PS、EXPLAINの結果:
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY i ALL NULL NULL NULL NULL 839
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 507
2 DERIVED bid_list index status item_id 4 NULL 5726 Using where
PPS、bid_listのインデックス:
PRIMARY BTREE Yes No id 5367 A
item_id BTREE No No item_id 1073 A
user_id BTREE No No user_id 894 A
status BTREE No No bid_status 1 A YES
made_bid_per_item BTREE No No status 5 A YES
item_id 1073 A
amount 5367 A