查看at the documentation,有关于如何构建SQL查询的相当好的说明。
我的代码如下所示:
$sqlQuery = new SQLQuery();
$sqlQuery->setFrom('PropertyPage')->selectField('PropertyType')->setDistinct(true);
我的目标是获得以下SQL:
SELECT DISTINCT PropertyType FROM PropertyPage
但是我回来了:
SELECT DISTINCT *, PropertyType FROM PropertyPage
即使他们自己的例子似乎也回馈了'SELECT DISTINCT *。我怎么能避免这个?
答案 0 :(得分:3)
为什么直接使用SQLQuery?
使用纯ORM,它应该是这样的:
$result = PropertyPage::get()->setQueriedColumns(array('PropertyType'))->distinct();
返回一个可以循环的DataList。
请参阅setQueriedColumns()和distinct()
您使用的是什么版本的SS框架? 3.1.7 iirc中添加了Distinct。
答案 1 :(得分:3)
只是为了添加@ wmk的答案以及直接解决如何使用SQLQuery
进行操作,您对selectField
的调用就是该查询发生的原因。 documentation to selectField
表示它添加了一个要选择的附加字段,而不是将列表限制为该字段。
他们的示例(A和B)也有问题的原因是the first parameter for the constructor for SQLQuery
is a default value of "*" for select statement。
要仍以您的代码为基础,请将selectField
替换为setSelect
。您的查询将如下所示:
SELECT DISTINCT PropertyType FROM PropertyPage
使用SQLQuery
直接查询数据库并不坏,特别是如果您真的只想要特定列的原始数据或结果本身不能用DataObject
表示(例如,使用列别名)。您还可以获得较小的性能改进,PHP无需实例化DataObject
。
虽然这样说,但是DataObject
以及它为每条记录公开的各种功能会更有用。