嵌套 select 在 Phalcon 的查询生成器中
nested select in Phalcon's query builder
我有两个表,Website 和 user_website_map
我想 select 具有嵌套 select 条件的网站
代码是这样的
$query = \Website::query()->addWhere('id in (SELECT user_website_map.website_id from security.user_website_map where user_id = :userId )', [':userId' => $this->getId()]) ;
return $query->execute();
这个语句抛出异常
Phalcon\Mvc\Model\Exception: Syntax error, unexpected token SELECT, near to ' user_website_map.website_id from security.user_website_map where user_id = :userId )', when parsing: SELECT [Website].* FROM [Website] WHERE id in (SELECT user_website_map.website_id from security.user_website_map where user_id = :userId ) (138)
如果我从数据库控制台执行此查询,不会发生错误。
SELECT * FROM main.website WHERE id in (SELECT user_website_map.website_id from security.user_website_map where user_id = 2)
有关信息,我使用的是 postgresql-9.4 和 Phalcon 1.3.4
这个陈述有什么问题?
这个查询可以——而且应该——通过连接而不是子查询来完成:
$query = \Website->query()
->join('UserWebsiteMap') // replace with actual model name
->where('user_id = :user_id:', array('user_id' => $this->getId()));
虽然我对 MySQL 比对 PostgreSQL 更熟悉,但我相信对于这两个数据库来说,相对于连接,子查询对性能都有负面影响。有关原因的解释,请参阅以下 link:Join vs. sub-query.
我有两个表,Website 和 user_website_map
我想 select 具有嵌套 select 条件的网站
代码是这样的
$query = \Website::query()->addWhere('id in (SELECT user_website_map.website_id from security.user_website_map where user_id = :userId )', [':userId' => $this->getId()]) ;
return $query->execute();
这个语句抛出异常
Phalcon\Mvc\Model\Exception: Syntax error, unexpected token SELECT, near to ' user_website_map.website_id from security.user_website_map where user_id = :userId )', when parsing: SELECT [Website].* FROM [Website] WHERE id in (SELECT user_website_map.website_id from security.user_website_map where user_id = :userId ) (138)
如果我从数据库控制台执行此查询,不会发生错误。
SELECT * FROM main.website WHERE id in (SELECT user_website_map.website_id from security.user_website_map where user_id = 2)
有关信息,我使用的是 postgresql-9.4 和 Phalcon 1.3.4 这个陈述有什么问题?
这个查询可以——而且应该——通过连接而不是子查询来完成:
$query = \Website->query()
->join('UserWebsiteMap') // replace with actual model name
->where('user_id = :user_id:', array('user_id' => $this->getId()));
虽然我对 MySQL 比对 PostgreSQL 更熟悉,但我相信对于这两个数据库来说,相对于连接,子查询对性能都有负面影响。有关原因的解释,请参阅以下 link:Join vs. sub-query.