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);
?>

実行結果

f:id:mkyosuke:20191202182947p:plain

●数を限定して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);
?>

実行結

f:id:mkyosuke:20191202184610p:plain

下記の場合は、「LIMIT0,30」は「最初から30行分だけ」という意味になります。

SELECT * FROM 'tb' LIMIT 0,30

●複数のテーブルを使う

例えば、次のような2つのテーブル「tb」と「tbx」があったとします。

テーブル「tb」                                       

f:id:mkyosuke:20191202185807p:plain

テーブル「tbx」

f:id:mkyosuke:20191202191955p:plain

テーブル「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);
?>

実行結果

f:id:mkyosuke:20191202200631p:plain

printの部分は、これまでと同じくSELECT文の実行結果をwhile文で繰り返し書き出しているだけです。

 

MySQLでの実行結果

SELECT tb.cd, tb.nm,tbx.com FROM tb JOIN tbx ON tb.cd = tbx.cd

f:id:mkyosuke:20191202200844p:plain