Повторное использование выражения в предложении SQL - PullRequest
1 голос
/ 01 декабря 2010

Я использую 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 голосов
/ 01 декабря 2010

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`

и ссылки на псевдонимы столбцов в предложении WHERE в SELECT из этого согласно ответу Марка.Я не совсем знаком с оптимизатором запросов MySQL, чтобы знать, будет ли какой-либо из этих подходов влиять на производительность.

0 голосов
/ 01 декабря 2010

Попробуйте, это должно работать.

Сначала вы должны создать представление

    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.

0 голосов
/ 01 декабря 2010

Создайте представление ваших данных, содержащее дополнительный столбец, и запросите это представление. После того как вы создали представление, запрос становится очень простым:

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