2010-12-01 3 views
1

저는 MySQL을 사용하고 있습니다. 복잡한 SQL 문장을 단순화하려고합니다.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') 

어떤 아이디어로 간단하게 작성할 수 있습니까? 감사합니다

+0

데이터베이스가 MyISAM을 사용 중이므로보기가 옵션이 아닙니다. 내가 아는 한 MyISAM은 뷰를 지원하지 않는다. ( – Ivan

답변

0

Create a view 여분의 열을 포함하고이보기를 쿼리하십시오. 뷰를 생성하면 쿼리가 매우 간단하게 :

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

SELECTSELECT에 정의 그래서 열 별칭이 WHERE에서 사용하는 사용할 수없는 WHERE 절 후 평가됩니다. 그렇게 당신은 아마도 having 절에 where 절에서 술어를 이동하는 쿼리를 재 작업 할 수 있지만 당신이 having 절에 열 별칭을 사용할 수 있다는 점에서

MySQL은 이례적인 일이다.

은 다른 방법은 다음과 같이 정의

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` 

와 뷰 또는 파생 테이블을 만들고 마크의 대답에 따라 그에서 SELECTWHERE 절에 열 별칭을 참조 할 수 있습니다. 필자는 이러한 접근법 중 하나가 성능에 영향을 미치는지 여부를 알기 위해 MySQL 쿼리 최적화 프로그램을 충분히 사용하지 못했습니다.

0

시도해보십시오. 작동해야합니다.

첫째, 당신은 당신이 이노를 사용하는 경우 쿼리는 해당 뷰

SELECT * FROM `view1` WHERE `price` > 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`

을 만들기 만들어야합니다.

+0

테이블이 InnoDB가 아니기 때문에 – Ivan

+0

나는 그것을 언급해야한다고 생각한다. (MYISAM, 나는 짐작한다). – Conan