SQL/Doctrine:左连接问题
目前这个功能可以工作:它显示一个特定的游戏,有多少工作 问题:如果没有工作,游戏不会出现在列表上 如何显示游戏,即使没有工作附加 谢谢SQL/Doctrine:左连接问题,sql,mysql,doctrine,left-join,Sql,Mysql,Doctrine,Left Join,目前这个功能可以工作:它显示一个特定的游戏,有多少工作 问题:如果没有工作,游戏不会出现在列表上 如何显示游戏,即使没有工作附加 谢谢 public function getWithGames() { $q = $this->createQuery('c') ->leftJoin('c.stJob j') ->where('j.expires_at > ?', date('Y-m-d h:i:s',
public function getWithGames()
{
$q = $this->createQuery('c')
->leftJoin('c.stJob j')
->where('j.expires_at > ?', date('Y-m-d h:i:s', time()))
->addOrderBy('c.name');
$q->andWhere('j.is_activated = ?', 1);
$q->andWhere('j.is_public = ?', 1);
return $q->execute();
}
你的条件应该是左连接的一部分。。。关于条款
$q = $this->createQuery('c')
->leftJoin('c.stJob j WITH j.expires_at > ? AND j.is_activated = 1 AND j.is_public = 1', date('Y-m-d h:i:s', time()))
->addOrderBy('c.name');
将条件放在ON
子句中(与WHERE
相反)表示它们专门适用于连接。如果没有行满足这些条件,那么就没有连接——这正是本例中需要的。将它们放在中,其中
表示结果行必须满足这些条件。显然,如果没有连接,就不能满足j
表的任何条件
$q->andWhere('j.is_activated = ?', 1);
$q->andWhere('j.is_public = ?', 1);
如果没有作业,则其已激活且为公共字段不能为1。它将为空,因此您需要类似的内容:其中(j.is_activated=1和j.is_activated=1)或(j.is_activated=null和j.is_activated=null)
我不知道你用什么librar来构造这个查询,但我猜它可能是这样工作的:
public function getWithGames()
{
$q = $this->createQuery('c')
->leftJoin('c.stJob j')
->where('j.expires_at > ?', date('Y-m-d h:i:s', time()))
->addOrderBy('c.name');
$q->andWhere('(j.is_activated = ? AND j.is_public = 1) OR (j.is_activated IS NULL AND j.is_publicIS NULL )', 1);
return $q->execute();
}
这不太好看。。。但正如我所说,我不知道你的图书馆。您可能会传递一组参数,或者执行类似“orWhere…”之类的操作
这样做也很笨拙,可以做得更好。直接使用条件建立联接!这样可以避免将整个表合并,然后进行过滤…我认为这真的不重要,因为这是一种左连接方式。所以不管条件在哪里应用。但看看他对问题的定义。如果没有作业,则不会列出该作业。所以他想要一个连接的valius,其中(作业属性public和activated为1)或(两者均为NULL)。。。(如果没有工作,就会发生这种情况)。最后一部分是他所忽略的,这非常重要。正在执行或。。。填充为空
完全不可取。ON
子句的目的是,这些是用于建立连接的条件。如果没有符合这些条件的行,那么就没有连接——在左连接的情况下也可以。试图用手动编写的“stuff is NULL”条件来模拟ON
子句是很难看的。我希望这不是在这里投反对票的原因,这是完全正确的。我不喜欢的是,这不是他的代码中的问题。他的代码中的问题是一个纯粹的语义问题,即不理解左连接的实际作用。谢谢,问题已经解决了。我以后会知道的。