2017-11-29 9 views
0

動的条件があります。ときどき条件があり、時にはそうではありません。すべての結果を左側から取得したいが、条件と一致しない行は除外したい。私はこれを達成する方法はありますか?私が持っているものでは、常に左からすべての行が得られます。内部結合を使用すると、結合できない場合はベース・テーブルからレコードを取得しません。アニメテーブルからすべてのレコードを取得できる必要がありますが、条件が設定されている場合は条件に一致するレコードのみを取得します。LEFT JOINテーブルがありますが、条件が一致しない場合は除外されます。

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で動的に生成されます。

条件の例は、私が左使用v.typeための条件が完全に無視されて参加し、それがアニメのテーブルからすべてのレコードを取得する場合、ここで問題がある

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

です。

左結合を実行すると、アニメ表からすべての行が取得されます。しかし、条件がある場合はすべての行を取得せず、条件に一致する行のみを取得したいとします。しかし、条件がない場合は、とにかくすべての行を取得します。

LEFT JOINの代わりにINNER JOINを使用すると、アニメにエピソードや動画がない場合は、取得できませんが、取得する必要があります。

+0

問題はどこですか? '$ conds'が設定されていると、' WHERE x = 'y''として、この条件に適合する行だけが選択されています。 – panther

+1

$ condにあるものを見ることなく、あなたの質問に答える方法はありません。アニメ表に条件があると、行が除外される可能性があります。 –

+0

例を追加 –

答えて

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のテストデータを追加してください。 このデータには期待される結果が表示されます。

0

"一般的な答え"は、左側の結合が "存続"するには、where節条件を使用する場合、左側の結合によってNULLが返されるようにする必要もあります。

WHERE anime.status = 'completed' AND (v.type = 'subbed' OR v.type IS NULL) 

NB:あなたは同じ効果を模倣するための機能を使用する場合、あなたは、インデックスへのアクセスを削除し、それがひどく、クエリのパフォーマンスに影響を与える可能性があります。

+0

私は実際にそれとは反対にしたい。左結合を実行すると、アニメーションテーブルからすべての行が取得されます。しかし、条件がある場合はすべての行を取得せず、条件に一致する行のみを取得したいとします。しかし、条件がない場合は、とにかくすべての行を取得します。 –

+0

もしあなたが正反対のことをしたいのであれば、彼がすでに質問していることをしてください。そのときに起こるのは、左のジョインがwhere句の条件によって無効にされ、そのジョイントの内部ジョインと同じになります。条件がない場合、すべてが返されるとは思わないでしょうか? –

+0

これは機能しますが、アニメにエピソードや動画がない場合は機能しません。私は左と内の結合の間に何か魔法が必要です。 –

関連する問題