PHPスクリプトからクエリ発行(SELECTでデータを並び替える)
●データを並び替える
実はデータベース では、SELECTで表示されるレコードの順番は不規則なのです。
つまりどんな順に表示されるのかは運次第といった状況です。
したがって「どんな順に表示されても文句は言わない」というとき以外は、表示順を指定する必要があります。
レコードを、指定したカラムの値の順に表示させるときは「ORDER BY」を使います。
レコードを昇順に表示させる
SELECT カラム名 FROM テーブル名
ORDER BY キーとなるカラム<降順の場合はDESC>
何も指定しないと昇順になりますが、降順に並び替えるときは、DESCを付けます。
次はテーブル「tb」でカラム「pr」の降順にに表示する例です。SELECT命令に「ORDER BY pr DESC」が付いてます。
例1
<?php
$d = mysqli_connect("localhost","root","") or die("接続失敗");
mysqli_select_db($d,"db");
$r = mysqli_query($d,"SELECT * FROM tb ORDER BY pr DESC");
while ($row = mysqli_fetch_array($r)){
print"{$row['cd']}{$row['nm']}{$row['pr']}<br>";
}
mysqli_close($d);
?>
実行結果
●数を限定してSELECT
SELECTで検索したとき、場合によっては非常にたくさんのレコードが表示されてしまうことがあります。
レコード数を限定して表示するときは「LIMIT」を使います。
レコード数を限定してSELECT
SELECT カラム名 FROM テーブル名 LIMIT レコード数
次は、テーブル「tb」でカラム「pr」の昇順で3レコードだけ表示する例です。
例2
<?php
$d = mysqli_connect("localhost","root","") or die("接続失敗");
mysqli_select_db($d,"db");
$r = mysqli_query($d,"SELECT * FROM tb ORDER BY pr LIMIT 3");
while($row = mysqli_fetch_array($r)){
print"{$row['cd']}{$row['nm']}{$row['pr']}<br>";
}
mysqli_close($d);
?>
実行結
下記の場合は、「LIMIT0,30」は「最初から30行分だけ」という意味になります。
SELECT * FROM 'tb' LIMIT 0,30
●複数のテーブルを使う
例えば、次のような2つのテーブル「tb」と「tbx」があったとします。
テーブル「tb」
テーブル「tbx」
テーブル「tbx」には各商品の製造元の情報が保存されています。このように複数のテーブルに分かれている情報を、共通の値を持つカラムをキーにして、関連付けて表示することができます。これを「結合」といいます。
結合にはいろいろな形式があるのですが、次は内部結合といわれるものです。
2つのテーブルを結合する(内部結合)
SELECT カラム名 FROM テーブル1
JOIN 結合するテーブル2
ON テーブル1のカラム = テーブル2のカラム
ONに、2つのテーブルを結び付けるキーとなるカラムの条件を書きます。
たとえば、テーブル「tb」と「tbx」のそれぞれのカラム「cd」を共通のキーにして、テーブル「tb」のカラム「cd」、テーブル「tb」のカラム「nm」、テーブル「tbx」のカラム「com」の3つを表示する場合を考えてみます。
まず、「テーブルの「tb」のカラム「cd」」という表現は間に「.」(ピリオド)を付けて「tb.com」のように表現します。すると表示させるカラムは次のように書けます。
・テーブル「tb」のカラム「cd」(テーブル「tbx」と共通)➡tb.cd
・テーブル「tb」のカラム「nm」 ➡tb.nm
・テーブル「tbx」のカラム「com」 ➡tbx.com
また、「結合するテーブル2」は「tbx」なので、次のようになります。
JOIN tbx
結合の条件は、テーブル「tb」と「tbx」のそれぞれの「カラム「cd」」なので次のようになります。
ON tb.cd = tbx.cd
これらを合わせると、次のようなSQL文になります。
SELECT tb.cd,tb,nm,tbx,com FROM tb
JOIN tbx
ON tb.cd = tbx.cd
テーブル「tb」と「tbx」のそれぞれの「カラム「cd」」を共通のキーにして、各カラムを表示させるPHPスクリプトです。
<?php
$d = mysqli_connect("localhost","root","") or die("接続失敗");
mysqli_select_db($d,"db");
$sql = "SELECT tb.cd, tb.nm,tbx.com FROM tb JOIN tbx ON tb.cd = tbx.cd";
$r = mysqli_query($d,$sql);
while($row = mysqli_fetch_array($r)){
print"{$row['cd']}{$row['nm']}{$row['com']}<br>";
}
mysqli_close($d);
?>
実行結果
printの部分は、これまでと同じくSELECT文の実行結果をwhile文で繰り返し書き出しているだけです。
MySQLでの実行結果
SELECT tb.cd, tb.nm,tbx.com FROM tb JOIN tbx ON tb.cd = tbx.cd