Mysql查询代码改进

标签 mysql

我对编码还很陌生,出于自己的兴趣,我正在尝试创建一个数据库系统以供工作和学习。

我有一个数据库查询,旨在显示最近的结果,其中 Sample NameTank NameCustomer 匹配。这些来自三个不同但相关的表。

我提出了以下查询。 此查询有效,但就我自己的教育而言,我是按照正确的路线工作还是有更好的方法来解决这个问题(这看起来非常凌乱且难以理解)?

SELECT 
  `t_workorders`.`Work Order`,
  `t_workorders`.`Date Sampled`,
  `Result`,
  `t_test_units`.`Unit` 
FROM
  `t_sampletests` 
  RIGHT JOIN `t_samples` 
    ON `Sample` = `pk_Sample` 
  RIGHT JOIN `t_workorders` 
    ON `t_samples`.`Work Order` = `t_workorders`.`Work Order` 
  LEFT JOIN `t_test_units` 
    ON `t_sampletests`.`Unit` = `t_test_units`.`pk_Unit` 
WHERE `t_sampletests`.`Test` = 
  (SELECT 
    `Test` 
  FROM
    `t_sampletests` 
  WHERE `pk_SampleTest` = $ testID) 
  AND `t_Samples`.`Sample Name` = 
  (SELECT 
    `Sample Name` 
  FROM
    `t_sampletests` 
    LEFT JOIN `t_Samples` 
      ON `Sample` = `pk_Sample` 
  WHERE `pk_SampleTest` = $ testID) 
  AND `t_Samples`.`Tank` = 
  (SELECT 
    `Tank` 
  FROM
    `t_sampletests` 
    LEFT JOIN `t_Samples` 
      ON `Sample` = `pk_Sample` 
  WHERE `pk_SampleTest` = $ testID) 
  AND `t_workorders`.`Customer` = 
  (SELECT 
    `Customer` 
  FROM
    `t_sampletests` 
    LEFT JOIN `t_Samples` 
      ON `Sample` = `pk_Sample` 
    LEFT JOIN `t_workorders` 
      ON `t_Samples`.`Work Order` = `t_workorders`.`Work Order` 
  WHERE `pk_SampleTest` = $ testID) 
  AND `t_workorders`.`Work Order` <> 
  (SELECT 
    `t_workorders`.`Work Order` 
  FROM
    `t_sampletests` 
    LEFT JOIN `t_Samples` 
      ON `Sample` = `pk_Sample` 
    LEFT JOIN `t_workorders` 
      ON `t_Samples`.`Work Order` = `t_workorders`.`Work Order` 
  WHERE `pk_SampleTest` = $ testID) 
ORDER BY `t_workorders`.`Work Order` DESC 
LIMIT 15 

如有任何替代或更合适方法的建议,我们将不胜感激。

非常感谢

最佳答案

IMO,使用新行和增量将帮助您阅读和构建查询,并让您快速了解它的作用。

我在使用 SQL 关键字时也尽量保持一致,并以大写形式书写。

SELECT `t_workorders`.`Work Order`, `t_workorders`.`Date Sampled`, `Result`,`t_test_units`.`Unit`
FROM `t_sampletests`
RIGHT JOIN `t_samples` ON `Sample` = `pk_Sample` 
RIGHT JOIN `t_workorders` ON `t_samples`.`Work Order` = `t_workorders`.`Work Order`
LEFT JOIN `t_test_units`ON `t_sampletests`.`Unit` = `t_test_units`.`pk_Unit`
WHERE `t_sampletests`.`Test` = (
    SELECT `Test` FROM `t_sampletests` WHERE `pk_SampleTest` = $testID
  )
  AND `t_Samples`.`Sample Name` = (
    SELECT `Sample Name`
    FROM `t_sampletests`
    LEFT JOIN `t_Samples` ON `Sample` = `pk_Sample` WHERE `pk_SampleTest` = $testID
  )
  AND `t_Samples`.`Tank` = (
    SELECT `Tank`
    FROM `t_sampletests`
    LEFT JOIN `t_Samples` ON `Sample` = `pk_Sample` WHERE `pk_SampleTest` = $testID
  )
  AND `t_workorders`.`Customer`= (
    SELECT `Customer`
    FROM `t_sampletests`
    LEFT JOIN `t_Samples` ON `Sample` = `pk_Sample`
    LEFT JOIN `t_workorders` ON `t_Samples`.`Work Order` = `t_workorders`.`Work Order`
    WHERE `pk_SampleTest` = $testID
  )
  AND `t_workorders`.`Work Order` <> (
    SELECT `t_workorders`.`Work Order`
    FROM `t_sampletests`
    LEFT JOIN `t_Samples` ON `Sample` = `pk_Sample`
    LEFT JOIN `t_workorders` ON `t_Samples`.`Work Order` = `t_workorders`.`Work Order` 
    WHERE `pk_SampleTest` = $testID
  )
ORDER BY `t_workorders`.`Work Order`
DESC LIMIT 15;

(不要忘记查询结束时的 ;)

关于Mysql查询代码改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38654178/

相关文章:

php - 使用 SSL 支持将 Piwik 前端(应用程序服务器)连接到远程 MySQL 服务器

mysql - Rails数据库结构及优化建议

php - 使用 MySQL、PHP 和 xml 进行 Google map 搜索

php 在终端上打印出 "Terminated",没有任何错误

php - mysql 选择 if 条件

java - 带有 Java 的动态 SQL 查询

mysql - 无法连接到我的 mac 上运行的 mysql

php - 使用 PHP 身份验证密码保护整个目录

mysql - 按天计算和分组 MySQL 查询

java - 建立与mysql数据库的连接(关于优化的问题)