1


0

1つのテーブルのすべての行に他のテーブルの対応者が存在しない場合でも、MySQLの2つのテーブルから選択する方法は?

オンラインショップ用に2つのテーブルがあります。

  • カテゴリ用:id、title

  • 製品用:id、ownerid、title、price(owneridは、 親カテゴリ)

すべてのカテゴリを選択し、各カテゴリの最低価格と最高価格も選択するため、次のクエリを実行します。

SELECT
sc.*, MIN(s.price) AS minp, MAX(s.price) AS maxp
FROM
categories AS sc, products AS s
WHERE s.ownerid=sc.id
GROUP BY sc.id

カテゴリに製品が含まれていない場合は選択されないという唯一の例外はありますが、期待どおりに機能します。 "s.ownerid = sc.id"を要求するので、これは論理的なように見えますが、意図したとおりに動作させるのに十分なSQLがわかりません。 すべてのカテゴリが必要です。製品を持たないカテゴリの場合、minpとmaxpは0でなければなりません。

何かアドバイス? ありがとう。

6 Answer


2


これを行うには、外部結合が必要です。 ところで、暗黙的な結合を使用してクエリを記述する方法は時代遅れであり、推奨されなくなりました。 JOINキーワードを使用することをお勧めします。 これにより、内部結合を外部結合に簡単に変更できます。

FROM categories AS sc
LEFT JOIN products AS s
ON s.ownerid=sc.id

NULLの代わりに0を返すには、http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_ifnull [IFNULL(…​、0)]を使用します。 クエリ全体は次のようになります。

SELECT
    sc.*,
    IFNULL(MIN(s.price), 0) AS minp,
    IFNULL(MAX(s.price), 0) AS maxp
FROM categories AS sc
LEFT JOIN products AS s
ON s.ownerid = sc.id
GROUP BY sc.id

また、製品のないカテゴリに対して0ではなくデフォルトのNULLを返す方が良いかどうかを検討することもできます。


2


「LEFT JOIN」(http://www.w3schools.com/sql/sql_join_left.asp[W3Schools])はどうですか?

SELECT
sc.*, MIN(s.price) AS minp, MAX(s.price) AS maxp
FROM
categories AS sc
LEFT JOIN products AS s
ON s.ownerid=sc.id
GROUP BY sc.id


0


左結合を作成します。

SELECT
sc.*, MIN(s.price) AS minp, MAX(s.price) AS maxp
FROM
categories AS sc
LEFT JOIN products AS s on s.ownerid=sc.id
GROUP BY sc.id

左結合を使用する場合、データは左結合の左側(ここではカテゴリ)、存在する場合は右側にあるテーブルから取得します。


0


あなたが望むのは、例えばLEF JOINだと思います:

SELECT sc。*、MIN(s.price)AS minp、MAX(s.price)AS maxp FROMカテゴリーsc LEFT JOIN製品s ON s.ownerid = sc.id GROUP BY sc.id


0


このhttp://phpweby.com/tutorials/mysql/32を見てください。基本的に、左または右の結合を作成する必要があります。


0


LEFT JOINを使用してみてください:

SELECT sc.*, MIN(s.price) AS minp, MAX(s.price) AS maxp
FROM categories AS sc
LEFT JOIN products AS s ON s.ownerid = sc.id
GROUP BY sc.id

ただし、デカルト積を使用することは最善の解決策ではありません。 ほとんどのエンジンは「離れたところ」で最適化できる必要がありますが、ほとんどの場合、結合ははるかに直感的であり、疑わしいほど高速です。