在SQL语句中重用表达式

时间:2010-12-01 12:24:47

标签: mysql simplify

我正在使用MySQL,我正在努力简化一些复杂的SQL语句。

查询是这样的:

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

此查询工作正常,但问题是我有一个重复的项目,我不知道如何简化它。我正在谈论的重复项目是:

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

有什么想简化它吗?感谢

3 个答案:

答案 0 :(得分:0)

Create a view您的数据包含额外列并查询此视图。创建视图后,查询变得非常简单:

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

答案 1 :(得分:0)

SELECT子句后评估WHERE,因此SELECT中定义的列别名无法在WHERE中使用。

MySQL不同寻常之处在于它允许您在having子句中使用列别名,因此您可以重新编写查询以将谓词从where子句移动到having子句。

或者,您可以使用以下定义创建视图或派生表

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`

并根据Mark的回答引用WHERESELECT子句中的列别名。我不太了解MySQL查询优化器,以了解这些方法中的任何一种是否会对性能产生影响。

答案 2 :(得分:0)

试试这个,它应该有效。

首先,您应该创建视图

    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`

为该视图创建查询选择

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

如果您使用InnoDB,这只会起作用。