【发布时间】:2014-07-16 15:45:06
【问题描述】:
我正在尝试在 ZendFramework 2 中设置子查询,但遇到了 Select 对象的限制函数问题。无论我做什么,数值都会放在引号之间,使我的查询失败:我应该得到 LIMIT 1 而我得到 LIMIT '1'。
似乎这不是第一次遇到这个问题,我看到一些人之前(比如 8 个月前)问过这个问题,但没有得到任何正确的答案。 我还看到这个问题已在 2012 年被标记为已解决 (https://github.com/zendframework/zf2/pull/2775),所以我真的不明白那里发生了什么。
这是我在 ZF2 中的代码:
$resultSet = $this->tableGateway->select( function (Select $select) use ($params) {
$sub = new Select();
$sub->from(array('temp' => 'scores'))
->columns(array(new \Zend\Db\Sql\Expression("id AS id")))
->where(array('temp.glitch' => array('None', 'Glitch')))
->where('temp.zone=scores.zone')
->order('temp.multi DESC, temp.score DESC')
->limit(1);
$select->join('players', 'player=players.id', array('player_name' => 'name', 'player_url' => 'name_url'))
->join('countries', 'players.country=countries.id', array('country_name' => 'name', 'country_iso' => 'iso'))
->join('cars', 'car=cars.id', array('car_name' => 'name'), 'left')
->join('zones', 'zone=zones.id', array('zone_name' => 'name'));
$select->where(array('scores.id' => $sub));
$select->order('scores.zone ASC');
print_r($select->getSqlString());
});
这应该呈现以下查询(除了 LIMIT '1' 而不是 LIMIT 1,我得到了正确的查询):
SELECT "scores".*, "players"."name" AS "player_name", "players"."name_url" AS "player_url", "countries"."name" AS "country_name", "countries"."iso" AS "country_iso", "cars"."name" AS "car_name", "zones"."name" AS "zone_name"
FROM "scores" INNER JOIN "players" ON "player"="players"."id"
INNER JOIN "countries" ON "players"."country"="countries"."id"
LEFT JOIN "cars" ON "car"="cars"."id"
INNER JOIN "zones" ON "zone"="zones"."id"
WHERE "scores"."id" = (SELECT id AS id FROM "scores" AS "temp" WHERE "temp"."glitch" IN ('None', 'Glitch')
AND temp.zone=scores.zone ORDER BY "temp"."multi" DESC, "temp"."score" DESC LIMIT 1)
ORDER BY "scores"."zone" ASC
由于这似乎不起作用,是否有另一种方法可以继续获得我的限制(使用 Mysql 5 数据库)?
编辑: 谢谢你的帮助。最后我想出了一种方法来按照我想要的方式完成工作,并通过简单地删除子查询结构并将其直接写入 where 函数来删除引号:
$select->where('scores.id = (SELECT id FROM scores AS lookup WHERE lookup.zone = scores.zone ORDER BY multi DESC , score DESC LIMIT 1)');
虽然我可以继续我的开发,但我更喜欢使用一个糟糕的技巧来摆脱这个问题,所以我会让这个问题无人回答,直到有人在那里提出真正的解决方案。 无论如何,可能根本没有解决方案,因为这可能是 ZF2 内核本身的问题。
【问题讨论】:
-
我认为您必须在
limit中使用变量而不是常量 1。如果是,那么只需将整数转换为变量。 -
我尝试使用 1、'1'、"1" 和一个变量(有和没有演员表),但它给出了相同的结果,并且在最终查询中有引号:/
标签: sql zend-framework2 subquery limit quotes