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_price。在game_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?这在单精度浮点误差范围内。

您会得到预期的结果,只需将其四舍五入到小数点后两位即可显示。

于 2013-02-08T21:32:53.347 回答