2013-02-08 68 views
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很好。只浮動價格是無效的。爲什麼這個號碼改變了?

+1

可能是因爲14.99無法在浮點數中精確表示。沒有多少數字可以。例如「我們是博格的浮點,準備近似」。 – 2013-02-08 21:08:00

+0

如何定義價格欄? INT或FLOAT還是什麼? – 2013-02-08 21:14:40

+0

價格欄定義爲FLOAT – Zalazdi 2013-02-08 21:27:48

回答

0

好吧,我不確定這是否正是你想要的,但我發佈我的修改後的查詢下面。首先,我擺脫了隱式連接,並用明確的INNER JOIN對其進行了修改。爲了獲得更好的性能,我還將您的subquerys與LEFT JOIN s一起移動。我刪除了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 
+0

的單精度浮點範圍內謝謝,一切正常 – Zalazdi 2013-02-08 21:30:18

0

你的意思是結果是24.9899997711182?這在單精度浮點型誤差範圍內。

您會得到預期的結果,您只需將其舍入爲小數點後兩位即可顯示。