2013-02-08 2 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». Возвращенный идентификатор продвижения - это хорошо. Только плавающая цена недействительна. Почему это число изменилось?

+1

, вероятно, потому, что 14,99 нельзя точно представить в плавающей запятой. НЕ МОЖЕТ БЫТЬ. например «Мы с плавающей точкой борга, подготовимся к приближению». –

+0

Как определяется столбец цены? INT или FLOAT или что? –

+0

Ценовая колонка определена FLOAT – Zalazdi

ответ

0

Хорошо, я не уверен, что это именно то, что вы хотели, но я отправляю свой измененный запрос ниже. Прежде всего, я избавился от неявного соединения и изменил его с явным INNER JOIN. Я также переместил ваши подзапросы с LEFT JOIN s для лучшей производительности. И я удалил 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 
+0

Спасибо, все работает – Zalazdi

0

Вы имеете в виду результат 24.9899997711182? Это находится в пределах допустимой погрешности с плавающей запятой.

Вы получаете ожидаемый результат, вам просто нужно округлить его до двух десятичных знаков для отображения.