1

categoryカテゴリ番号をカテゴリ名にリンクするテーブルがあります。例: 1 - 果物、2 - 野菜、3 - 昆虫、4 - 都市など...

itemちょうど 1 つのカテゴリに属する​​アイテムを含む別のテーブルがあります。各アイテムには、一意の ID、名前、およびそのカテゴリがあります。例: 314-かぼちゃ-(カテゴリ)1

要するに:

category
-------
c_id   (int)
c_name (varchar)

item
-------
i_id   (int)
i_name (varchar)
i_cat  (int)

問題は、すべてのカテゴリにアイテムがあるわけではないことです。以下を使用して、カテゴリ別に注文されたアイテムを取得しました。

$STH = $DBH->prepare("SELECT * FROM item ORDER BY i_cat");

これは表に組み込まれ、猫 (egory) の変化に応じて見出しが抽出されます。もちろん、項目のないカテゴリはピックアップされません。

私が欲しいのは、すべてのカテゴリ (実際のアイテムがないものも含む) を含み、各カテゴリの下に正しいアイテムをリストするテーブルです。

やりたいことをするための面倒な方法を考案することはできますが、きちんとした解決策があるはずです。すべてのカテゴリとすべてのアイテムが存在するように、1 回の呼び出しで両方のテーブルのデータを結合するにはどうすればよいですか? の使用が含まれているとinner join思いますが、効率的に行う方法がわかりません。

ありがとう。

4

2 に答える 2

2

実際、それはinner joinあなたが探しているものではありません。は、一致するinner joinすべての値を取得し、一致しない値を削除します。Aleft joinは、左側のテーブルから値を取得し、それらを右側のテーブルの値と結合しようとします。左側のテーブルの行の右側に一致するアイテムがない場合、それらの値は。で埋められNULLます。

このクエリを試してみてください。

select * from category
left join item on c_id = i_id
order by i_cat
于 2012-04-09T05:44:18.163 に答える
2

次のクエリを試すと、テーブルからすべてのカテゴリが取得され、categoryテーブルから対応するアイテムが取得されitemます。

SELECT * 
FROM category c
LEFT JOIN item i
ON c.c_id = i.i_cat
ORDER BY i_cat
于 2012-04-09T05:41:07.867 に答える