2011-08-06 6 views
1

以前は、this SQL queryに関するヘルプを依頼しました。親カテゴリーに属するスニペットをカテゴリーIDを使用して結合します。内部にスニペットがないのに、すべてのカテゴリを表示するように変更しようとしましたが、管理できません。空のカテゴリを表示するようにSQLクエリを変更します。

このクエリの結果を印刷しても空のカテゴリは表示されないため、これはPHPの問題ではないと確信しています。

私はこれを理解するのに役立ち、必要なものを表示するために変更する必要があります。

SELECT c.id AS cid, c.slug AS cslug, c.name AS cname, s.id AS sid, s.name AS sname 
FROM categories AS c 
LEFT JOIN snippets AS s ON s.category = c.id 
WHERE c.live=1 AND s.live=1 AND c.company='$company' AND s.company='$company' 
ORDER BY c.name, s.name 

任意のヒントやSQLを学ぶための良いリソースへのリンクがあまりにもいただければ幸いです。

は、ここでSQLです。 :)

ここでは、PHPの実行時にクエリが返す内容の例を示します。 SQL http://jsbin.com/obonal PHP Inefficient SQL Query

+0

例題の結果を投稿できますか? – Bytemain

+0

SQLとPHPの例でOPを編集しました – PaulAdamDavis

答えて

5

スニペット条件を結合のon節に移動します。

あなたはwhere句でそれを残す場合は、結果の行は、それを一致させるために必要とされていますが、スニペットから欠落している行がnull値を持つことになりますので、s.live=1falseとなり、あなたが一致を得ないだろう。

SELECT c.id AS cid, c.slug AS cslug, c.name AS cname, s.id AS sid, s.name AS sname 
FROM categories AS c 
LEFT JOIN snippets AS s ON s.category = c.id AND s.live=1 AND s.company='$company' 
WHERE c.company='$company' 
AND c.live=1 
ORDER BY c.name, s.name 

キー:句に、スニペットからの行のみがそれを一致させるために必要とされますが、スニペットが一致しないとき、あなたはまだカテゴリから行を取得するようleftで、マッチングはオプションでは

部分はjoin on句であり、これは任意に複雑にすることができ、s.live=1の例では真の "結合"述語である必要はありません(つまり、テーブル間の値を比較する必要はありません。 :

LEFT JOIN snippets AS s ON s.category = c.id AND s.live=1 AND s.company='$company' 

mysqlのようないくつかのデータベースでは、元の構文が依然として適切に機能することができます。

EDITED s.company = '$ company'もon節に移動しました。ありがとう@Andriy

+1

問題の中核をどのように要約したのか、私は同意しますが、クエリのWHERE句には実際に右側のテーブルの条件が含まれています( 's.company = '$ company'')。 –

+0

@Andriy Oh - それに気付かなかった。私もそれを移動します! – Bohemian

+0

ありがとう、ボヘミアンと@アンドリー。質問は今私がそれを必要とする方法で動作し、私はどのように知っている!乾杯。 – PaulAdamDavis

0

RIGHT JOINと同じ結果が得られますか?

0

完璧なマッチングが必要な場合は、内部結合が必要です。左からすべての行と右から左に同​​じIDを持つすべての行が必要な場合は、左結合が必要です。

関連する問題