php - 使用参数从 mysqli_query 输出中获取单行,没有循环

标签 php mysql sql

是否可以根据特定列的值从行数组 { got from mysqli_fetch_array('result_from_mysqli_query'>) } 中获取单行 mysqli_query 结果,而无需循环的帮助?

我是 PHP 新手,请告诉我是否有此功能?我正在努力改进用 PHP 编写的应用程序,该应用程序有一个复杂的查询,执行时间超过 500 秒。查询是这样的:

SELECT distinct(t1.`testName`) AS test1, t1.`className`, t1.`duration`, t1.`id`, t1.`skipped`, t1.`failedSince`, t1.`buildNumber`, t1.`errorStackTrace`, t2.`errorStackTrace` AS E2, t3.`errorStackTrace` AS E3, t4.`errorStackTrace` AS E4, t5.`tester`, t1.`comments`, t2.`comments` AS C2, t2.`buildNumber` AS B2, t3.`comments` AS C3, t3.`buildNumber` AS B3, t4.`comments` AS C4, t4.`buildNumber` as B4, t5.`tester` AS owner, t5.`jira_id`, t6.`occurences`
from
`sample` AS t1
left join `testnametester` as t5 ON t1.`testName` = t5.`testCase`
left join `statsbuilder` as t6 on t1.`testName`= t6.`testName`
left join `sample` as t2 on t1.`testName` = t2.`testName`
left join `sample` as t3 on t1.`testName` = t3.`testName`
left join `sample` as t4 on t1.`testName` = t4.`testName`
where t1.`buildNumber`=500 and t1.`errorStackTrace` IS NOT NULL and t2.`buildNumber`=499 and t3.`buildNumber`=498 and t4.`buildNumber`=497 group by t1.id order by t1.testName desc

现在,为了使这个查询更快,我尝试分别执行对 t2、t3 和 t4 的查询,并从这些查询结果中逐一获取与 t1(基于测试名称)的结果匹配的那一行,并且用它来打印数据表。现在,如果我使用循环从与 t1 的 testName 匹配的 t2/t3/t4 结果中获取数据,那么复杂性将保持不变。

最佳答案

首先,尝试优化您的查询可能是个好主意。 MySQL 通常比您更擅长 self 优化。

查看 https://dev.mysql.com/doc/refman/5.7/en/using-explain.html一些解释。基本上,把 EXPLAIN在您的查询之前,MySQL 会向您显示一些有关查询如何运行的信息 - 使用了哪些索引等。如果您想要快速查询,您应该在正确的列上添加索引 - 你做到了吗?

其次,为什么要执行 4 个(连接)查询?你不能只写WHERE t1.buildNumber >= 497 AND t1.buildNumber <= 500吗? ?

例如:

SELECT distinct(t1.`testName`) AS test1,
       t1.`className`,
       t1.`duration`,
       t1.`id`,
       t1.`skipped`,
       t1.`failedSince`,
       t1.`buildNumber`,
       t1.`errorStackTrace`,
       t1.`comments`,

       -- t5.`tester`, we can remove this one as you're selecting it twice
       t5.`tester` AS OWNER,
       t5.`jira_id`,
       t6.`occurences`,
FROM `sample` AS t1
LEFT JOIN `testnametester` AS t5 ON t1.`testName` = t5.`testCase`
LEFT JOIN `statsbuilder` AS t6 ON t1.`testName`= t6.`testName`
WHERE `t1`.`buildNumber` >= 497
  AND `t1`.`buildNumber` <= 500
  AND `t1`.`errorStackTrace` IS NOT NULL
GROUP BY t1.id
ORDER BY t1.testName DESC

关于php - 使用参数从 mysqli_query 输出中获取单行,没有循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43722402/

相关文章:

mysql - mysql 查询问题

sql - 如何对 varchar 列中存储的时间跨度求和?

PHP jQuery 脚本修改/修正

php - INSERT 或重复 KEY UPDATE

php - 显示单个日期,除非它们是连续日期

mysql - MySQL 中相同值的多个情况的 SELECT REPLACE

html - 显示为问号的字符

mysql - 批处理执行的SQL语句可更新两个表

php - Laravel 获取用户今天和明天生日

java - 应用程序关闭时 FCM 推送通知不起作用 Android