有這樣一個現有的結果表;MYSQL默認爲ALL,如果沒有行返回
race_id race_num racer_id place
1 0 32 2
1 1 32 3
1 2 32 1
1 3 32 6
1 0 44 2
1 1 44 2
1 2 44 2
1 3 44 2
etc...
有很多PHP腳本訪問這個表格會以很好的格式輸出結果。
現在我有一種情況,只需要輸出某些race_nums的結果。 所以我創建了這張表races_included。
race_view race_id race_num
Day 1 1 0
Day 1 1 1
Day 2 1 2
Day 2 1 3
而且可以使用此查詢來獲得正確的結果。
SELECT racer_id, place from results WHERE race_id=1
AND race_num IN
(SELECT race_num FROM races_included WHERE race_id='1' AND race_view='Day 1')
這是偉大的,但我只需要這個功能了幾場比賽,並把它在簡單的情況下,顯示所有的種族兼容模式下工作。我需要添加大量的行到races_included表。像
race_view race_id race_num
All 1 0
All 1 1
All 1 2
All 1 3
95%的我的種族不使用每日功能。
所以我正在尋找一種方法來改變查詢,所以如果對於第一場比賽中races_included表中沒有記錄它默認爲所有比賽。另外,我需要它與沒有IN子句的查詢具有相同的執行速度,因爲這個查詢或它的變體被使用了很多。
確實有效的一種方法是將表重新定義爲races_excluded並使用NOT IN。這很好用,但是在添加或刪除比賽時管理表格是一件痛苦的事情。
有沒有簡單的方法來使用EXISTS和IN作爲子查詢來獲得所需的結果?或者我想念的其他一些巧妙的技巧。
澄清我發現了一個工作但非常緩慢的解決方案。
SELECT * FROM race_results WHERE race_id=1
AND FIND_IN_SET(race_num, (SELECT IF((SELECT Count(*) FROM races_excluded
WHERE rid=1>0),(SELECT GROUP_CONCAT(rnum) FROM races_excluded
WHERE rid=1 AND race_view='Day 1' GROUP BY rid),race_num)))
它基本上是檢查是否有任何記錄存在該race_id,如果沒有返回一組等於當前race_num如果是返回包含種族NUMS的列表。
不是我所期待的。我寧願在沒有使用此功能的比賽中的結果包含表中記錄任何記錄。 – davewhirlwind