在我的网站上,我想使用数据库中的大量不同数据。目前,我使用四个查询来收集不同的数据。但有没有办法让它更有效率并将它们放入一个大问题?我该怎么做?
编辑:所以答案是简单地将所有查询放在一起,并在数据库查询中使用尽可能多的数据操作,而不是在php中。
...
"State": {
"Error": "",
"ExitCode": 9,
"FinishedAt": "2015-01-06T15:47:32.080254511Z",
"OOMKilled": false,
"Paused": false,
"Pid": 0,
"Restarting": false,
"Running": true,
"StartedAt": "2015-01-06T15:47:32.072697474Z",
"Status": "running"
},
...
答案 0 :(得分:1)
您可以将所有查询合并为一个,如下所示:
$qry = "SELECT COUNT(*) cnt,
AVG(level) avg_lvl,
SUM(IF(onlinestatus=1, 1, 0)) online_cnt,
(SELECT Max(time) FROM refreshes) refresh_time
FROM rookstayers";
foreach ($db->query($qry) as $row){
$amount_total = $row['cnt']
$level = $row['avg_lvl'];
$online_amount = $row['online_cnt'];
$milliseconds = $row['refresh_time'] + 1800000;
$update_time = DateTime::createFromFormat('U', intval($milliseconds / 1000));
}
您的最后一个查询似乎假设结果中只有一条记录,因为循环会覆盖每次迭代中的前一个结果。而且由于该查询中没有order by
,结果将是一个小赌博。所以我从表中获取了最近的时间,以防有多个记录。
请注意,上述循环只执行一次,因为可以保证从查询中获得一个结果。
答案 1 :(得分:0)
第一个和第三个查询可以组合成一个:
select count(*) as num, sum(onlinestatus = 1) as numOnline
from rookstayers;
第二个应该是聚合:
select level, count(*) as cnt
from rookstayers
group by level;
第四个也是聚合;我不确定数据究竟是什么样的,但它似乎是这样的:
select sum(time + 1800000)
from refreshes;
通常,您应该尽可能多地在数据库中进行数据操作。这就是数据库的设计目标。
编辑:
第一,第二和第三可以组合成:
select count(*) as num, sum(onlinestatus = 1) as numOnline,
avg(level) as avgLevel
from rookstayers;