mysql多组通过

问题描述:

好时光!告诉我如何优化这个查询,如果可能的话,把它合并成一个!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'变量包含什么。否则,这对我们来说是个谜。 –

看起来您的查询只需要在四列中获取不同值的列表。

这里有一个方法,你可以用一个查询做到这一点:

值将在一个行返回,每列将包含一个字符串,它是一个逗号分隔的不同值的列表数据库中的每个相应列。你将不得不使用PHP到explode()每个这些字符串到一个数组中。

您可能会优化此查询的唯一方法是为要使用的$dateRange条件创建一个索引。但是你的问题中没有包含$dateRange的值,所以我会把它留给你弄清楚。

真的,每个查询都有不同的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。取决于多少记录和多少费用过滤器是