我有两个表,网站和user_website_map
我想选择具有嵌套选择条件的网站
代码就是这个
$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的信息 这个陈述有什么问题?
答案 0 :(得分:1)
此查询可以 - 而且应该 - 使用连接而不是子查询来完成:
$query = \Website->query()
->join('UserWebsiteMap') // replace with actual model name
->where('user_id = :user_id:', array('user_id' => $this->getId()));
虽然我比使用PostgreSQL更熟悉MySQL,但我相信对于这两个数据库来说,子查询相对于连接对性能有负面影响。请参阅以下链接以获取解释原因:Join vs. sub-query。