LEFT JOIN表,但如果条件不匹配

时间:2017-11-29 07:20:30

标签: mysql

我有动态的条件。有时有条件,有时没有。我希望从左侧获得所有结果,但排除与条件不匹配的行。有什么办法可以实现吗?凭借我拥有的东西,它始终从左侧获取所有行。如果我使用内连接,如果他们无法加入,它将无法从基表中获取记录。我需要能够从动画表中获取所有记录,但是如果设置了条件,则只获取符合条件的记录。

SELECT anime.id, anime.title, IF(english IS NULL or english = '', anime.title, english) as english, anime.slug
FROM anime
LEFT JOIN genres g ON g.anime_id = anime.id
LEFT JOIN episodes e ON e.anime_id = anime.id
LEFT JOIN videos v on v.episode_id = e.id
$conds
GROUP BY anime.id
ORDER BY $order
LIMIT $limit

$ conds,$ order和$ limit是用php动态生成的。

条件的一个例子是

WHERE anime.status = 'completed' AND v.type = 'subbed'

这里的问题是如果我使用左连接,则完全忽略v.type的条件,并从动画表中获取所有记录。

执行左连接将获取动画表中的所有行。但是,如果存在条件并且只有与条件匹配的行,我希望不获取所有行。但如果没有条件,那么无论如何都要获得所有行。

如果我使用INNER JOIN而不是LEFT JOIN,如果动漫没有剧集或视频,它就不会获得它们,但我需要获得它们。

3 个答案:

答案 0 :(得分:1)

我也遇到过类似的问题,需要使用EXISTS,如下例:

SELECT t1.* FROM table_1 t1 
WHERE EXISTS (SELECT t2.* FROM table2 t2
WHERE t1.id=t2.t1_id AND t2.some_field='some value')

因此您的查询应如下所示:

SELECT anime.id, anime.title, IF(english IS NULL or english = '', anime.title, english) as english, anime.slug
FROM anime
LEFT JOIN genres g ON g.anime_id = anime.id
LEFT JOIN episodes e ON e.anime_id = anime.id
WHERE EXISTS (SELECT v.* FROM videos v WHERE v.episode_id = e.id AND v.type = 'subbed')
AND anime.status = 'completed'
GROUP BY anime.id
ORDER BY $order
LIMIT $limit

我知道你的问题很老,但我把这个提交给有类似问题的人:)

答案 1 :(得分:0)

也许您需要以下

$query_with_condition = "SELECT ...
FROM anime
LEFT JOIN genres g ON g.anime_id = anime.id
LEFT JOIN episodes e ON e.anime_id = anime.id
LEFT JOIN videos v on v.episode_id = e.id
$conds
GROUP BY anime.id
ORDER BY $order
LIMIT $limit";

$query_without_condition = "SELECT ...
FROM anime
LEFT JOIN genres g ON g.anime_id = anime.id
LEFT JOIN episodes e ON e.anime_id = anime.id
LEFT JOIN videos v on v.episode_id = e.id
GROUP BY anime.id
ORDER BY $order
LIMIT $limit";

$result = mysql_query($query_with_condition, $conn);
$num_rows = mysql_num_rows($result);

// if the query with conditions doesn't return any rows
if(!$num_rows){
  // then we use the second query where no conditions
  $result = mysql_query($query_without_condition, $conn);
}

// use $result

我不知道,但也许你需要以下

WHERE anime.status = 'completed' AND IFNULL(v.type,'subbed') = 'subbed'

如果此行未与视频相关联,它还会从左表中返回行。

如果我弄错了,请添加表animevideos的测试数据。 并显示此数据的预期结果。

答案 2 :(得分:0)

"通用答案"如果你想要左边的加入"幸存"在where子句条件中,您还必须允许左连接返回NULL。

userInfo() {
        this.http.get('/user-info').subscribe(
            (data: any) => {
                this.id = data.id
                console.log(this.id);
            }
        )

    }

nb:如果使用函数模仿相同的效果,则删除对索引的访问权限,这可能会严重影响查询性能。