2010-12-01 8 views
1

Ich benutze MySQL und ich werde verrückt versuchen, ein bisschen komplex SQL-Satz zu vereinfachen. dieseWiederverwendung Ausdruck in SQL-Satz

Die Abfrage ist:

SELECT `provider`.*,`products`.`placement`,`price`.`price`+ 
    IFNULL((SELECT `price` FROM `price` WHERE `handle`= 
    (SELECT `group` FROM `group_provider` WHERE `provider_id`=`provider`.`id`)),'0') AS `price` 
FROM `provider` 
LEFT JOIN `products` ON `provider`.`id`=`products`.`web` 
LEFT JOIN `price` ON `price`.`handle`=`provider`.`id` 
WHERE `products`.`type`='$PRODUCT_TYPE' 
    AND `price`.`price`+ 
    IFNULL((SELECT `price` FROM `price` WHERE `handle`= 
    (SELECT `group` FROM `group_provider` WHERE `provider_id`=`provider`.`id`)),'0')>0 

Diese Abfrage funktioniert perfekt, aber das Problem ist, dass ich eine wiederholte Einzelteil haben, und ich weiß nicht, wie es zu vereinfachen. Das wiederholte Element, das ich spreche, ist:

`price`.`price`+ 
    IFNULL((SELECT `price` FROM `price` WHERE `handle`= 
    (SELECT `group` FROM `group_provider` WHERE `provider_id`=`provider`.`id`)),'0') 

Irgendeine Idee, es zu vereinfachen? Danke

+0

Eine Ansicht, es ist keine Option aufgrund der Datenbank verwendet MyISAM. Soweit ich weiß MyISAM unterstützt keine Ansichten :( – Ivan

Antwort

0

Create a view Ihrer Daten, die die zusätzliche Spalte enthält und diese Ansicht abfragt. Nachdem Sie die Ansicht erstellt haben, wird die Abfrage sehr einfach:

SELECT * 
FROM your_view 
WHERE type = 42 
AND price > 0 
0

Die SELECT nach der WHERE Klausel ausgewertet wird so Spalte Aliase in den SELECT definiert ist nicht in den WHERE verwenden zur Verfügung.

MySQL ist ungewöhnlich, dass es Sie Spalte Aliase in der having Klausel zu verwenden, ermöglicht es aber so könnten Sie möglicherweise die Abfrage überarbeiten, um das Prädikat aus der where Klausel auf eine having Klausel zu bewegen.

Alternativ könnten Sie eine Ansicht oder eine abgeleitete Tabelle mit der folgenden Definition Antwort

SELECT `provider`.*   , 
     `products`.`placement`, 
     `price`.`price`+ IFNULL(
     (SELECT `price` 
     FROM `price` 
     WHERE `handle`= 
       (SELECT `group` 
       FROM `group_provider` 
       WHERE `provider_id`=`provider`.`id` 
       ) 
     ) 
     ,'0')>0 AS `price` 
FROM `provider` 
     LEFT JOIN `products` 
     ON  `provider`.`id`=`products`.`web` 
     LEFT JOIN `price` 
     ON  `price`.`handle`=`provider`.`id` 

und verweisen auf die Spalte Aliase in der WHERE Klausel in einem SELECT aus, dass gemäß Mark erstellen. Ich bin nicht ausreichend mit dem MySQL-Abfrageoptimierer vertraut, um zu wissen, ob einer dieser Ansätze Performanceimplikationen hätte.

0

Versuchen Sie es, es sollte funktionieren.

Zunächst sollten Sie Ansicht

CREATE VIEW `DB`.`view1` AS 
    SELECT `provider`.*, `products`.`placement`, `price`.`price`+ IFNULL((SELECT 
    `price` FROM `price` WHERE `handle`= (SELECT `group` FROM `group_provider` 
    WHERE `provider_id`=`provider`.`id`)),'0') AS `price` 
    FROM `provider` 
    LEFT JOIN `products` ON `provider`.`id`=`products`.`web` 
    LEFT JOIN `price` ON `price`.`handle`=`provider`.`id`

Abfrage erstellen wählen für diese Ansicht

SELECT * FROM `view1` WHERE `price` > 0

Das einzige Werk, erstellen, wenn Sie InnoDB verwenden.

+0

Ich fürchte, die Tabellen sind nicht InnoDB – Ivan

+0

ich denke, du solltest es erwähnen (MYISAM, ich denke) auf Ihre Frage – Conan