0

クエリがあります:

SELECT 
    DISTINCT `g`.`id` , 
    `g`.`steam_id` , 
    `g`.`type` , 
    `g`.`title` ,
    `g`.`price` , 
    `g`.`metascore` , 
    `g`.`image` ,
    (
        SELECT `id`
        FROM `game_promotions`
        WHERE `game_promotions`.`game_id` = `g`.`id`
    ) AS `promotion_id`,
    (

        SELECT `price`
        FROM `game_promotions`
        WHERE `game_promotions`.`game_id` = `g`.`id`
    ) AS `promotion_price`, 
    (
        SELECT COUNT( `id` )
        FROM `bot_games`
        WHERE `game_id` = `g`.`id`
        AND `buyer` IS NULL
    ) AS `copies`
FROM 
    `games` AS `g` , 
    `game_genres` AS `gg`
WHERE
    `gg`.`game_id` = `g`.`id`
    AND `g`.`title` LIKE "Counter%"
GROUP BY `promotion_id`
LIMIT 0 , 30

そして問題が悪い返品promotion_pricegame_promotionsテーブルではprice「24.99」ですが、クエリ結果promotion_priceでは「14.9899997711182」です。返されたプロモーション ID は良好です。浮動小数点価格のみが無効です。なぜこの数字が変わったのですか?

4

2 に答える 2

0

わかりました、これがまさにあなたが望んでいたものかどうかはわかりませんが、修正したクエリを以下に投稿します. まず、暗黙の結合を取り除き、明示的な結合に変更しましたINNER JOIN。また、パフォーマンスを向上させるために、サブクエリを LEFT JOINs で移動しました。そして、なぜあなたがそれらを必要とするのか本当に理解できなかっDISTINCTたので、私は とを削除しました。GROUP BY

SELECT 
    `g`.`id` , 
    `g`.`steam_id` , 
    `g`.`type` , 
    `g`.`title` ,
    `g`.`price` , 
    `g`.`metascore` , 
    `g`.`image`,
    `gp`.`id` AS `promotion_id`,
    `gp`.`price` AS `promotion_price`, 
    `bg`.`copies`
FROM 
    `games` AS `g`
INNER JOIN `game_genres` AS `gg`
    ON `gg`.`game_id` = `g`.`id`
LEFT JOIN `game_promotions` as `gp`
    ON `g`.`id` = `gp`.`game_id`
LEFT JOIN ( SELECT `game_id`, COUNT(`id`) `copies`
            FROM `bot_games`
            WHERE `buyer` IS NULL
            GROUP BY `game_id`) `bg`
    ON `bg`.`game_id` = `g`.`id`
WHERE `g`.`title` LIKE "Counter%"
LIMIT 0 , 30
于 2013-02-08T21:16:15.147 に答える
0

結果は 24.9899997711182 ということですか? これは、単精度浮動小数点の誤差範囲内です。

期待どおりの結果が得られます。表示するには、小数点以下 2 桁に丸める必要があります。

于 2013-02-08T21:32:53.347 に答える