Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL/Doctrine:左连接问题_Sql_Mysql_Doctrine_Left Join - Fatal编程技术网

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
子句是很难看的。我希望这不是在这里投反对票的原因,这是完全正确的。我不喜欢的是,这不是他的代码中的问题。他的代码中的问题是一个纯粹的语义问题,即不理解左连接的实际作用。谢谢,问题已经解决了。我以后会知道的。