2017-02-26 94 views
1

我正在嘗試執行最佳性能的SQL查詢。多個加入/內部連接的過濾條件SQL

首先我想要的結果30000中進行隨機挑選一個城市再加入結果與條件

ON `r1`.`ville_nom_reel` = `r3`.`full_name` 

(基於同樣的城市名)另一個表。 這個疑問我想補充一個過濾器只顯示其結果

r1`.`ville_population_2012` > 10000 

這裏是我的主查詢:運行大約0.010秒。

SELECT * FROM `inspitravel`.`villes_france_free` AS `r1` 
    JOIN (SELECT CEIL(RAND() * (SELECT MAX(`ville_id`) FROM `inspitravel`.`villes_france_free`)) AS `ville_id`) AS `r2` USING (`ville_id`) 
    INNER JOIN `inspitravel`.`villes_booking` AS `r3` 
    ON `r1`.`ville_nom_reel` = `r3`.`full_name` 

如何過濾這些條件的結果請?

`r1`.`ville_population_2012` > 10000 
+0

會讓你有什麼覺得這是一個法語網站?你有沒有看法文的帖子? –

+0

至於你的問題,你有沒有嘗試添加'WHERE r1.ville_population_2012> 10000'? –

+0

我刪除了SQL Server標記。這顯然是MySQL。 –

回答

1

我會用一個可行的查詢開始:

SELECT * 
FROM (SELECT vff.* 
     FROM inspitravel.villes_france_free vff 
     WHERE ville_population_2012 > 10000 
     ORDER BY rand() 
     LIMIT 1 
    ) vff JOIN 
    inspitravel.villes_booking vb 
    ON vff.ville_nom_reel = vb.full_name; 

您可以提高此查詢的性能與villes_france_free(ville_population_2012)的索引。

然後,減少此查詢的運行時間的安全方法是在WHERE子句中使用rand()。例如,你可以使用此約90%,以減少大小進行排序:

SELECT * 
FROM (SELECT vff.* 
     FROM inspitravel.villes_france_free vff 
     WHERE ville_population_2012 > 10000 AND 
      rand() < 0.1 
     ORDER BY rand() 
     LIMIT 1 
    ) vff JOIN 
    inspitravel.villes_booking vb 
    ON vff.ville_nom_reel = vb.full_name; 

然而,選擇準確的值取決於匹配城鎮的數量。

像這樣的正常工作:

SELECT * 
FROM (SELECT vff.* 
     FROM inspitravel.villes_france_free vff CROSS JOIN 
      (SELECT COUNT(*) as cnt FROM inspitravel.villes_france_free vff WHERE ville_population_2012 > 10000 
      ) x 
     WHERE ville_population_2012 > 10000 AND 
      (cnt < 100 OR rand() < 0.1 * cnt) 
     ORDER BY rand() 
     LIMIT 1 
    ) vff JOIN 
    inspitravel.villes_booking vb 
    ON vff.ville_nom_reel = vb.full_name; 
+0

非常感謝:最後一個很好(約0.086秒)!我認爲現在至少需要兩個星期來理解這個查詢:-) –