複数カラムの値を別問い合わせの複数カラム結果に基づいて抽出する – 行副問い合わせ MySQL

 プチMySQLメモ

 MySQLで、あるカラム値が別の問い合わせ結果の一覧に含まれているか問い合わせる場合に使うのが副問い合わせ(サブクエリ)

 例えば、商品一覧テーブル items があって、在庫一覧テーブル stock の在庫数量 stock_num が0より多い(在庫がある)商品を検索する場合、共通の商品ID item_id で関連を持っているとすれば

SELECT * FROM items WHERE item_id IN (SELECT item_id FROM stock WHERE stock_num > 0)

 行副問い合わせは、複数カラムを使った副問い合わせ。

 例えば、共通の item_id が無くて、商品名 item_name とメーカー名 item_maker によって管理されている場合には

SELECT * FROM items WHERE ROW(item_maker, item_name) IN (SELECT item_maker, item_name FROM stock WHERE stock_num > 0)

 のようにして、複数カラムによって問い合わせることが出来る。

 なお、副問い合わせは1カラムなので名前に関係ないが、行副問い合わせでは複数のカラムの対応を取るためにカラム名を使うので、主テーブルのカラム名と副問い合わせテーブルのカラム名が異なるときには、カラム AS カラム名(SELECT stock_item_maker AS item_maker, stock_item_name AS item_name FROM stock…の様に)でカラム名を書き換えて対応を取らせる。

※テストケースとして副問い合わせを使っているが、これらのパターンの場合、MySQLでは結合(JOIN)した方が高速である場合が多いのには注意

(1060)


カテゴリー: MySQL   パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です