2017-02-25

サブクエリが使えないときは内部結合を使う

はじめに

mySQLを使用していると(WordPressでも使用するかも?)、AとB、2つのテーブルが存在して、Bのテーブルからある条件にマッチした結果をAのテーブルの検索条件として使用したい!ということがあると思います。自分もそういうことがあったので調べたところ、「サブクエリ」というものがある事を知りました。サブクエリはざっくりいうと、ある検索の結果を他の検索条件にする、というものらしいく、聞くところだと目的を達成できそうだったのですが、サブクエリでは思った通りの結果を得ることができませんでした(詳細は忘れてしまいましたが)。そこでもっと色々調べたところ出てきたのが「内部結合」です。

内部結合とは

内部結合(INNER JOIN)は、サブクエリがAのテーブルとBのテーブルを別個に扱うのに対し、名前の通り、2つのテーブルを結合して1つのテーブルとして扱い、そこから結果を取得するというものです。

基本的な書き方としては、

SELECT テーブル名.カラム名, ... FROM テーブル名A INNER JOIN テーブル名B ON テーブル名A.カラム名A = テーブル名B.カラム名B;

とします。「テーブル名.カラム名」として、結合する2つのテーブルのうちどちらのカラムであるかを明示します。ONの後に記述する「テーブル名A.カラム名A = テーブル名B.カラム名B」の部分でどのカラムを基準にしてテーブルを結合するか決定し、結合されたテーブルに対して処理が実行されます。テーブル間でに一致するデータを持つカラムがある事が前提条件として必要ですが、サブクエリで引っ張ってこられなかったデータもこれなら上手く取り出す事ができました。また、「ORDER BY テーブル名.カラム名 条件」というような感じでORDER句もつけられます。

以下の例では、テーブル「single」と「popular」をそれぞれのカラム「id」で結合し、「popular」テーブルのカラム「number」を基準に降順で「single」テーブルの「title」と「content」を8件取得するというものです。

SELECT single.title,single.content FROM single INNER JOIN popular ON single.id = popular.id ORDER BY popular.number DESC LIMIT 8";

このようにして、サブクエリでは得られなかった結果を、内部結合を用いて得る事ができました。

さいごに

他にもやりようはあるのかもしれませんが、サブクエリで何故だか上手くいかなかった人は、ぜひ内部結合によるデータの取得も試してみてください。

人によってはサブクエリをディスった形に見える記事になってしまいましたが、基本仕事ではWordPressを使用しているので、データベースにSQL文を流し込むこともありません。ですのでこっちの知識が疎いせいで上手くサブクエリを使えなかったというのもあると思うので、サブクエリが悪者だとは限らないので、あしからず。



コメントする(※は必須項目です)













画像認証