2010-06-21 58 views
4

我有一個充滿了運動結果的數據庫。我想根據以前的結果的某些特徵選擇一些結果。這裏的數據庫結構:如何根據其他行中的值選擇行

CREATE TABLE `results` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , 
    `date` DATETIME NOT NULL , 
    `home_score` INT NOT NULL , 
    `away_score` INT NOT NULL , 
    `home_team_id` INT NOT NULL , 
    `away_team_id` INT NOT NULL 
); 

所以我想要做的查詢,如「找到其中一隊贏得了他們的前兩個主場比賽的結果」 - 按日期,即針對特定home_team_id順序由然後選擇每行在前兩行的home_score> away_score。

我知道這有點複雜,所以任何關於如何解決這個問題的指針都將受到大力讚賞。我目前在PHP中有一個版本(選擇所有行,然後執行這種類型的查詢),但是性能很慢並且使用了大量內存(數據庫中有超過20,000行)。

編輯:感謝幾個整潔的答案。不過,理想情況下,我希望能夠在所有欄目上進行查詢,而不僅僅是看W,D或L.一個更復雜的例子是「找到所有的結果,其中主隊贏得了他們之前五個家中的每一個比賽至少有兩個進球,而客隊至少已經輸掉了一個進球。「

回答

2

如果你想這樣做表現不錯,你應該鏈接表中的連續結果,例如。有一個prev_result_id列,只要你插入一個新結果,你就設置爲前一個結果。這樣你可以解決問題如下:

SELECT * FROM 
    (SELECT * FROM results WHERE home_team_id = ID ORDER BY date DESC LIMIT 1) r1 
    INNER JOIN results r2 ON r2.id = r1.prev_result_id 
    WHERE r1.home_score > r1.away_score AND r2.home_score > r2.away_score 

編輯。 爲了進一步改善這一點,您還可以使用next_result_id字段(已編制索引),並將最後一個結果的值設爲NULL(因爲還沒有下一個結果)。這樣,你可以得到擺脫子查詢從,因爲你沒有按日期在所有訂購:

SELECT * FROM results r1 INNER JOIN results r2 ON r2.id = r1.prev_result_id 
WHERE r1.home_team_id = ID AND r1.next_result_id IS NULL 
AND r1.home_score > r1.away_score AND r2.home_score > r2.away_score 

這是特別的好方法,如果你想找到的是贏得了所有球隊他們以前的比賽,因爲現在你可以簡單地從where子句中省略r1.home_team_id = ID,並且它應該爲每個贏得他們前兩場比賽的球隊提供一行。

2

根據您需要的全部查詢,我可能會考慮denormalising。 例如在球隊表中添加,如

home_performance = 'WWDLWW' 
away_performance = 'WWLLWL' 
overall_performance = 'WWWWDLLLWWWL' 

然後即席查詢,如贏得了他們的最後兩個主場比賽列可以通過連續做

home_performance LIKE '%WW' 

還是贏得了4回答是overall_performance LIKE '%WWWW%'

這些派生列可以通過使用GROUP_CONCAT

相關問題