2014-06-18 34 views
0

有這樣一個現有的結果表;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的列表。

回答

0

您可以通過在子查詢使用or做到這一點:

SELECT racer_id, plac 
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' or raw_view = 'ANY') 
       ); 
+0

不是我所期待的。我寧願在沒有使用此功能的比賽中的結果包含表中記錄任何記錄。 – davewhirlwind