2013-12-12 56 views
-4

我正在使用Yii CDbCommand从mysql中获取结果。
我在mysql查询中记录了SQL,并通过var_dump Yii的CDbCommand SQL同时记录了SQL。
这是一样的。 我通过CDbCommand-> queryAll()得到结果。
但结果与在phpMyAdmin中运行相同的SQL不一样。Yii CDbCommand queryAll()返回错误结果

> SELECT `referer_url_id` FROM `trend_referer` WHERE 
> ((`site_id` = '45654' and `date` between '20131211' and '20131211')) 
> GROUP BY `referer_url_id` LIMIT 6 
> OFFSET 30; 

此SQL。我从queryAll和phpMyAdmin获得了6个结果。
但其中只有3个是相同的。其他3个不同。
这很奇怪。

编辑: 最奇怪的是,这个问题几分钟后消失。
并发生在另一个'限制6 OFFSET XX'。
XX在所有时间都不一样。
所以我认为它是PDO或Yii中的缓存机制?

+0

尝试'(日期'在'20131211'和'20131211'之间)' – zzlalani

+2

你期待什么样的答案?该查询所有假数据库返回一些结果? –

+0

' - > queryAll()'不会奇迹般地重写原始查询以获得不同的结果。如果在多次运行同一查询时得到不同的结果,这意味着查询中的某些内容(结果排序顺序)不是确定性的。你为什么使用GROUP BY而不是ORDER BY?表模式是什么样的? – DCoder

回答

0

试试这个

SELECT `referer_url_id` FROM `trend_referer` WHERE 
((`site_id` = '45654' and (`date` between '20131211' and '20131211'))) 
GROUP BY `referer_url_id` LIMIT 6 
OFFSET 30; 

加圆括号包围date between '20131211' and '20131211'

编辑:

而对于偏移误差 'LIMIT 6 OFFSET XX'。

查询更改为

GROUP BY `referer_url_id` LIMIT 30, 6 
+0

这不是sql问题。我得到6个结果,其中3个相同,3个通过queryAll()和phpMyAdmin不同。 phpMyAdmin的结果是正确的。 queryAll()返回错误的结果。 – Magic

+0

你有没有试过这个建议? – zzlalani

+0

是的,我试过了。不行。 – Magic

-2

我知道是什么问题。因为Yii CDbCommand.php的buildQuery()函数加入SQL使用"\n"作为换行符而不是空格。例如,

SELECT * FROM table WHERE 1=1 GROUP BY field;

将成为

SELECT *\nFROM table\nWHERE 1=1\nGROUP BY field; 

导致不同的结果。
我修改了buildQuery()。将“\ n”替换为空格。我可以得到正确的结果集。

我正在针对MySQL-5.5.18-log版本进行测试。我不知道它是MySQL错误还是Yii。

+0

这显然不是问题。可能是你之前猜测的某种缓存。 –