Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Yii addInCondition with floats: How to ? and why addInCondition('column', array(1.1, 1.3)) don't work?

Tags:

sql

php

yii

How to addInCondition with floats?

I tried a lot.

This works ok:

$criteria=new CDbCriteria();
$criteria->addInCondition('order_id',array(36907));
$tasks=OrderTask::model()->findAll($criteria);

In my case it returns 4 models:

But if I try

$criteria=new CDbCriteria();
$criteria->addInCondition('order_id',array(36907));
$criteria->addInCondition('step',array(3.20));
$tasks=OrderTask::model()->findAll($criteria);

Or

$criteria=new CDbCriteria();
$criteria->addInCondition('step',array("3.20"));
$tasks=OrderTask::model()->findAll($criteria);

Or

$criteria=new CDbCriteria();
$criteria->addInCondition('step',array('3.2'));
$tasks=OrderTask::model()->findAll($criteria);

Results are empty.

According to log, the query is:

system.db.CDbCommand.query(SELECT * FROM orders_tasks t WHERE step=:ycp1. Bound with :ycp1=3.2)

This query in phpmyadmin returns 5360 rows

SELECT * FROM  `orders_tasks`  `t` WHERE step = 3.20

This queries in phpmyadmin returns 0 rows

SELECT * FROM  `orders_tasks`  `t` WHERE step = '3.20'
SELECT * FROM  `orders_tasks`  `t` WHERE step = '3.2'
SELECT * FROM  `orders_tasks`  `t` WHERE step = "3.20"

This try

$criteria=new CDbCriteria();
$criteria->addInCondition('step',array("3,20"));
$tasks=OrderTask::model()->findAll($criteria);

returns Models with step=3 OR 20

This query in phpmyadmin returns rows with step=3 OR 20

SELECT * FROM  `orders_tasks`  `t` WHERE step = '3,20'

So, how to addInCondition with floats?

Details, for instance

step field is float(8,2)

Sql table dump:

CREATE TABLE IF NOT EXISTS `orders_tasks` (
  `task_id` int(11) NOT NULL AUTO_INCREMENT,
  `order_id` int(11) NOT NULL,
  `step` float(6,2) NOT NULL,
  `done` int(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`task_id`),
  KEY `order_id` (`order_id`),
  KEY `step` (`step`),
  KEY `orderstep` (`order_id`,`step`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

Yii version: 1.1.10

like image 836
Max Zhuravlev Avatar asked Feb 06 '13 08:02

Max Zhuravlev


1 Answers

DROP TABLE IF EXISTS `prefix_test`;

CREATE TABLE IF NOT EXISTS `prefix_test` (
  `task_id` int(11) NOT NULL AUTO_INCREMENT,
  `order_id` int(11) NOT NULL,
  `step` float(6,2) NOT NULL,
  `done` int(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`task_id`),
  KEY `order_id` (`order_id`),
  KEY `step` (`step`),
  KEY `orderstep` (`order_id`,`step`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;


INSERT INTO `prefix_test` VALUES (1,36907,3.20,0);
INSERT INTO `prefix_test` VALUES (2,36907,3.21,0);
INSERT INTO `prefix_test` VALUES (3,37907,4.13,0);

$criteria=new CDbCriteria();
$criteria->addInCondition('order_id',array(36907));
$criteria->addInCondition('step',array(3.20));
$tests=Test::model()->findAll($criteria);


echo "Rows: ".count($tests)."<br>";
#Returns Rows: 0

Query in Yii logs

SELECT * FROM `prefix_test` `t` WHERE (order_id=:ycp0) AND (step=:ycp1). Bound with :ycp0=36907, :ycp1=3.2

Real query in MySql logs

SELECT * FROM `prefix_test` `t` WHERE (order_id=36907) AND (step='3.2')

This will fix you problem

ALTER TABLE `prefix_test` CHANGE `step` `step` decimal(10,2) NOT NULL;

After that your query returns

#Returns Rows: 1
like image 164
dr0zd Avatar answered Sep 27 '22 02:09

dr0zd