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);
答
看起来您的查询只需要在四列中获取不同值的列表。
这里有一个方法,你可以用一个查询做到这一点:
值将在一个行返回,每列将包含一个字符串,它是一个逗号分隔的不同值的列表数据库中的每个相应列。你将不得不使用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。取决于多少记录和多少费用过滤器是
当询问SQL查询问题时,请始终在查询中引用的表中包含“SHOW CREATE TABLE”的输出,因此我们不必猜测列和您目前可能拥有的索引。另外请让我们知道你的'$ dateRange'变量包含什么。否则,这对我们来说是个谜。 –