2016-07-29 20 views
1

Ich bin ziemlich neu in der Codierung und durch mein eigenes Interesse versuche ich, ein Datenbanksystem für die Arbeit zu schaffen und sehr viel zu lernen, während ich mitfahre.Mysql Abfrage Code Verbesserung

Ich habe eine Datenbankabfrage, die entworfen wurde, um jüngste Ergebnisse anzuzeigen, wo Sample Name, Tank Name und Customer übereinstimmen. Diese stammen aus drei verschiedenen, aber verwandten Tabellen.

Ich habe die folgende Abfrage erstellt. Diese Abfrage funktioniert aber für meine eigene Ausbildung arbeite ich in die richtige Richtung oder gibt es eine bessere Möglichkeit, dieses Problem anzugehen (das sieht sehr unordentlich aus und ist mir schwer zu lesen)?

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 

Alle Vorschläge zu alternativen oder geeigneteren Ansätzen wären sehr willkommen.

Vielen Dank

+0

irgendein Problem auf diese Frage? –

+0

Was ist mit dem Versuch, es zu formatieren, so dass es leicht gelesen werden kann. Benutze neue Zeilen und inkrementiere ..? – John

+0

Ich schlage vor, nicht wie dieses Recht zu verwenden Join 't_workorders .. Dies wird alle Felder von t_workorders –

Antwort

0

IMO, neue Zeilen und Inkremente helfen Ihnen lesen und strukturieren die Abfrage und ermöglichen Ihnen einen schnellen Überblick über Was es macht.

Ich versuche auch konsistent zu sein, wenn Sie SQL-Schlüsselwörter verwenden und sie in Großbuchstaben schreiben.

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; 

(und nicht zu vergessen das ; bei dann der Anfrage beenden)

0

Etwas wie folgt aus:

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 

dies wird Ihre Anfrage

Vermeiden Auswahl aller Felder in einer Tabelle optimiert, dass Sie ihn nicht benutzen .. wählen Sie nur Felder, die Sie wollen um zu optimieren

Verwandte Themen