2017-08-30 47 views
-2

好時光!告訴我如何優化這個查詢,如果可能的話,把它合併成一個!mysql多組通過

$query = "SELECT external_source_id FROM smf_tds_unique_statistic WHERE ".$dateRange." GROUP BY external_source_id ORDER BY external_source_id ASC;"; 
$query .= "SELECT sources_id FROM smf_tds_unique_statistic WHERE ".$dateRange." GROUP BY sources_id ORDER BY sources_id ASC;"; 
$query .= "SELECT ip_country FROM smf_tds_unique_statistic WHERE ".$dateRange." GROUP BY ip_country ORDER BY ip_country ASC;"; 
$query .= "SELECT cidr FROM smf_tds_unique_statistic WHERE ".$dateRange." GROUP BY cidr ORDER BY cidr ASC;"; 

if (mysqli_multi_query($db, $query)) { 
do { 
    if ($result = mysqli_store_result($db)) { 

     while ($row = mysqli_fetch_row($result)) { 
      $val = $row[0]; 
      if ($val != '') { 
       $options .= '<li class="select_input_option_item" value="'.$val.'">'.$val.'</li>'; 
      } 
     } 
     array_push($optionsArr, $options); 
     $options = ''; 

     mysqli_free_result($result); 
    } 

    if (!mysqli_more_results($db)) break; 
} while (mysqli_next_result($db));} mysqli_close($db); 
+0

當詢問SQL查詢問題時,請始終在查詢中引用的表中包含「SHOW CREATE TABLE」的輸出,因此我們不必猜測列和您目前可能擁有的索引。另外請讓我們知道你的'$ dateRange'變量包含什麼。否則,這對我們來說是個謎。 –

回答

-1

看起來您的查詢只需要在四列中獲取不同值的列表。

這裏有一個方法,你可以用一個查詢做到這一點:

值將在一個行返回,每列將包含一個字符串,它是一個逗號分隔的不同值的列表數據庫中的每個相應列。你將不得不使用PHP到explode()每個這些字符串到一個數組中。

您可能會優化此查詢的唯一方法是爲要使用的$dateRange條件創建一個索引。但是你的問題中沒有包含$dateRange的值,所以我會把它留給你弄清楚。

0

真的,每個查詢都有不同的GROUP BY和ORDER BY,所以最好的辦法是使用UNION

$query = <<<QRY 
SELECT external_source_id as ID 
    FROM smf_tds_unique_statistic 
    WHERE $dateRange 
    GROUP BY external_source_id 
    ORDER BY external_source_id ASC 
UNION 
SELECT sources_id ID 
    FROM smf_tds_unique_statistic 
    WHERE $dateRange 
    GROUP BY sources_id 
    ORDER BY sources_id ASC 
UNION 
SELECT ip_country ID 
    FROM smf_tds_unique_statistic 
    WHERE $dateRange 
    GROUP BY ip_country 
    ORDER BY ip_country ASC 
UNION 
SELECT cidr ID 
    FROM smf_tds_unique_statistic 
    WHERE $dateRange 
    GROUP BY cidr 
    ORDER BY cidr ASC 
QRY; 

你應該明白我的意思。另一種方法是使用日期過濾器一次,並創建一個INDEXED TEMP表,並在您的UNION中使用THAT。取決於多少記錄和多少費用過濾器是