我有动态的条件。有时有条件,有时没有。我希望从左侧获得所有结果,但排除与条件不匹配的行。有什么办法可以实现吗?凭借我拥有的东西,它始终从左侧获取所有行。如果我使用内连接,如果他们无法加入,它将无法从基表中获取记录。我需要能够从动画表中获取所有记录,但是如果设置了条件,则只获取符合条件的记录。
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,如果动漫没有剧集或视频,它就不会获得它们,但我需要获得它们。
答案 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'
如果此行未与视频相关联,它还会从左表中返回行。
如果我弄错了,请添加表anime
和videos
的测试数据。
并显示此数据的预期结果。
答案 2 :(得分:0)
"通用答案"如果你想要左边的加入"幸存"在where子句条件中,您还必须允许左连接返回NULL。
userInfo() {
this.http.get('/user-info').subscribe(
(data: any) => {
this.id = data.id
console.log(this.id);
}
)
}
nb:如果使用函数模仿相同的效果,则删除对索引的访问权限,这可能会严重影响查询性能。