2017-08-30 5 views
-2

おはようございます!このクエリを最適化する方法を教えてください。可能であれば、それを1つに統合してください!複数のグループを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

クエリは、4つの列に異なる値のリストを取得する必要があるようです。ここで

は、1つのクエリでこれを行うことができます方法です。

値が一列に返され、各列はからの個別の値をカンマで区切ったリストである文字列が含まれていますデータベース内のそれぞれの列。これらの文字列のそれぞれを配列としてexplode()にPHPを使用する必要があります。

このクエリを最適化する唯一の方法は、$dateRange条件を使用するためのインデックスを作成することです。しかし、あなたの質問に$dateRangeの値を含めていないので、私はそれを理解するためにあなたに任せます。

0

は本当に、すべてのクエリがによっておよび順序で別のグループを持っているので、あなたの最善の策はあなたのアイデアを得る必要があります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; 

を使用することです。もう1つの方法は、日付フィルタを一度使用し、INDEXED TEMPテーブルを作成し、そのUNIONでTHATを使用することです。いくつのレコードがどれくらいかかり、どれくらいの費用がかかりますか

関連する問題