2016-07-29 60 views
1

我对编码相当陌生,并且通过我自己的兴趣,我尝试为工作创建一个数据库系统,并且随着我的进展非常多地学习。Mysql查询代码改进

我有一个数据库查询,它旨在显示Sample Name,Tank 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 

任何建议的替代或更合适的方法将不胜感激。

非常感谢

+0

任何问题,这个查询? –

+0

如何格式化它以便可以轻松读取它。使用新的线和增量..? – John

+0

我建议不要使用像这样的权利加入 't_workorders ..这将包括来自t_workorders的所有字段 –

回答

0

国际海事组织,使用新的行和增量将帮助您阅读和结构查询,并让您有一个快速概述 它能做什么。

我也尝试使用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; 

(不要忘了在;然后结束你的查询)

0

事情是这样的:

select feild1, field2 from 
(select feild1, field2 from table1)as a 

left join 

select field1, desc from table2) as b 
on a.field1 = b.field1 

这将优化您的查询

避免选择你不使用它在一个表中的所有领域。选择你只想领域以显示优化