【问题标题】:Yii addInCondition with floats: How to ? and why addInCondition('column', array(1.1, 1.3)) don't work?Yii addInCondition 与浮点数:如何?为什么 addInCondition('column', array(1.1, 1.3)) 不起作用?
【发布时间】:2013-01-21 09:13:38
【问题描述】:

如何用浮点数添加InCondition?

我尝试了很多。

这工作正常:

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

在我的例子中,它返回 4 个模型:

但如果我尝试

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

或者

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

或者

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

结果为空。

根据日志,查询为:

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

phpmyadmin 中的这个查询返回 5360 行

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

phpmyadmin 中的这个查询返回 0 行

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"

这次尝试

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

返回 step=3 OR 20 的模型

phpmyadmin 中的此查询返回 step=3 OR 20 的行

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

那么,如何使用浮点数addInCondition

例如详情

step 字段为float(8,2)

Sql 表转储:

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 版本:1.1.10

【问题讨论】:

  • step是什么字段? varchardecimal?
  • @dInGd0nG 它是 float(6,2) 例如: 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 默认字符集=utf8 AUTO_INCREMENT=4 ; -- -- 转储表 orders_tasks 的数据 -- INSERT INTO orders_tasks (task_id, order_id, step, done) VALUES (1, 36907, 3.20, 0), (2, 36907 , 3.00, 0), (3, 36907, 20.00, 0);
  • 在问题上添加您的代码,编辑并粘贴到那里。这样,任何查看问题的人都可以获得所有需要的信息,而无需阅读所有 cmets。
  • @Yaroslav 完成,谢谢

标签: php sql yii


【解决方案1】:
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

在 Yii 日志中查询

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

MySql 日志中的真实查询

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

这会解决你的问题

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

之后您的查询返回

#Returns Rows: 1

【讨论】:

  • 有效!因此,修复是“将 sql 字段类型从浮点数更改为十进制数”。谢谢。
猜你喜欢
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
  • 2021-12-23
相关资源
最近更新 更多