gpt4 book ai didi

mysql - 如何使用for循环优化Mysql查询

转载 作者:太空宇宙 更新时间:2023-11-03 12:02:12 27 4
gpt4 key购买 nike

此查询需要很长时间才能执行。有人告诉我如何优化这个查询吗?

$sql = '';
$now = time();
$until = $now + 604800;

for ($i=0; $i < 7 ; $i++) {
$dayno = date('N', $now + ($i * 86400));
$sql .= "SELECT p.id, p.iam, p.offertimes, p.fromcity, p.tocity, p.days, p.parcel, p.seats, p.price,
CASE
WHEN days LIKE '%{$dayno}%' THEN
(select unix_timestamp(addtime(timestamp(date(now())+{$i}),time(from_unixtime(deadline)))))
ELSE deadline
END AS deadline,

c1.nameRu AS 'from',
c2.nameRu AS 'to',
c3.nameRu AS 'city'
FROM posts AS p
LEFT JOIN citynames AS c1 ON p.from_id = c1.id
LEFT JOIN citynames AS c2 ON p.to_id = c2.id
LEFT JOIN citynames AS c3 ON p.city_id = c3.id
WHERE p.deadline > {$now} ";
if ($i == 0) {
$sql .= "AND {$now} < (SELECT unix_timestamp(addtime(timestamp(date(now())), time(from_unixtime(deadline))))) ";
}
$sql .= "AND p.days LIKE '%{$dayno}%' UNION ALL ";
}
$sql .= "SELECT p.id, p.iam, p.offertimes, p.fromcity, p.tocity, p.days, p.parcel, p.seats, p.price, p.deadline,
c1.nameRu AS `from`,
c2.nameRu AS `to`,
c3.nameRu AS `city`
FROM posts AS p
LEFT JOIN citynames AS c1 ON p.from_id = c1.id
LEFT JOIN citynames AS c2 ON p.to_id = c2.id
LEFT JOIN citynames AS c3 ON p.city_id = c3.id
WHERE p.deadline > {$now} AND p.days = '' ORDER BY `deadline` ASC";

更新:我必须发布两种类型的帖子,第一种是一次和出发(例如 2015 年 3 月 25 日,早上 7:00),第二种是定期和出发(例如每周一、周五、周日上午 8:00 至 2015 年 4 月 12 日) ).我想要的是:当用户搜索代码必须根据工作日名称(直到下周)将所有常规帖子转换为第一个帖子类型时,但我必须保持小时和分钟不变。我将我的离开保存在一个字段(截止日期)中,以便额外提交的常规帖子(天数)。这是我的 mysql 表(简短):

offertime|from_id|to_id|via_id|deadline  |days
2 | 52| 43| 73|1432036859|1,2,7
1 | 72| 65| 66|1424860459|
2 | 55| 23| 88|1425149999|1,2,3,4,5,6,7
  • offertime = 2(常规)
  • offertime = 1(一次)

最佳答案

一些建议的改进,以及很多问题:

posts 需要“compound”INDEX(days, deadline)。请向我们展示 SHOW CREATE TABLE,以便我们可以看到数据类型和索引。

你能避免 LIKE '%{$dayno}%' 中的前导通配符吗?请向我们展示这些的示例值。

unix_timestamp(addtime(timestamp(date(now())+{$i}) --> UNIX_TIMESTAMP(CURDATE() + INTERVAL {$i} 天

请解释这应该做什么。它不是那样做的!(选择 unix_timestamp(addtime(timestamp(date(now())+{$i}), time(from_unixtime(deadline)))))我这么说是因为 time(from_unixtime('2014-01-01')) = 16:33:34.000000,这可能不是您所期望的。

{$now} --> NOW()

$until没用?

在 UNION 之后加入城市名是否有意义?

SELECT ...
FROM ( your union without citynames )
LEFT JOIN citynames <3 times>

您有一个复杂的表达式,其中隐藏了 deadline。试着把它从里到外变成

AND deadline > (some complex constant expression)

那样的话,索引就可以用了。 (从而加快查询速度。)

请“回应”生成的 SQL 并让我们对其进行评论;使用 PHP 很难工作。

请提出建议,得到回应,然后我们再做。

关于mysql - 如何使用for循环优化Mysql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28648749/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com