浮点数和子查询

时间:2013-02-08 21:06:41

标签: mysql sql

我有疑问:

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_price。在game_promotions表格中,price为“24.99”,但在查询结果中promotion_price为“14.9899997711182”。返回的促销ID很好。只有浮动价格无效。为什么这个号码已经改变了?

2 个答案:

答案 0 :(得分:0)

好的,我不确定这是不是你想要的,但我在下面发布我修改过的查询。首先,我摆脱了隐式连接,并使用显式INNER JOIN进行了更改。为了更好的表现,我还用LEFT JOIN s移动了你的subquerys。我删除了DISTINCTGROUP 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

答案 1 :(得分:0)

你的意思是结果是24.9899997711182吗?这是在单精度浮动误差范围内。

您得到了预期的结果,您只需要将其四舍五入以显示。