1

私は 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')

それを簡素化するためのアイデアはありますか?ありがとう

4

3 に答える 3

0

余分な列を含むデータのビューを作成し、このビューにクエリを実行します。ビューを作成すると、クエリは非常に単純になります。

SELECT *
FROM your_view
WHERE type = 42
AND price > 0
于 2010-12-01T12:32:32.727 に答える
0

は句の後に評価されるため、 で定義された列エイリアスは で使用SELECTできません。WHERESELECTWHERE

ただし、MySQL は、句でカラム エイリアスを使用できるという点で珍しいので、クエリを作り直して述語を句から句havingに移動する可能性があります。wherehaving

または、次の定義でビューまたは派生テーブルを作成することもできます

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 クエリ オプティマイザについて十分に理解していません。

于 2010-12-01T12:34:01.383 に答える
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 を使用している場合にのみ機能します。

于 2010-12-01T13:25:26.280 に答える