2016-07-29 3 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

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; 

(그리고이 ;에서 다음 쿼리의 끝 잊지 마세요)이 쿼리에

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 

이 최적화됩니다 쿼리

당신이 그것을 사용하지 않는 테이블의 모든 필드를 선택하지 마십시오 .. 선택 만 필드