‘DB’カテゴリーの記事

DISTINCT »

CakePHP といえば、このあいだ早速けつまづいたことがあったので、書き留めておく。

あるフィールドの値を重複なしですべてリスト化したかったのだが、

$keyLists = array();
$SQLStr = 'SELECT DISTINCT column FROM dbTables ORDER BY forSortColumn ASC';
if ($Res = mysql_query($SQLStr)) {
    while ($Row = mysql_fetch_row($Res)) {
        $keyLists[] = $Row[0];
    }
}

これを、findAll() とかでできるかと思ったら、DISTINCT をどう指定していいのかわからなくて、結局上記コードのままになっている。で、これをメソッドとしてモデルに追加したのだが……こういう場合、これで正解? それとも別の手がある?

追記

自前のクエリを発行する場合は query() が使えるということがわかった。これならコントローラーで気軽に(?)使える。この場合、返ってくるのはCakePHPモデルの他のAPIを使った時と同様の構造を持つ配列。
ただ、これを使用した場合の新たな疑問は、DBテーブル名にプレフィックスを付加している場合、他のAPIではプレフィックスを意識せずに使えるけれど、query() の場合は意識しないといけないらしい、ということ。
ビュー内で使用する時、常にこのプレフィックスを付けて($Variable['PreFix_Table']['Column'] とか)呼び出すのは、何だかちょっと気持ち悪い感じがする……。統一して $Variable['Table']['Column'] のように使いたい場合はどうすれば?
というわけで、それが解決するまでは、自前メソッドのままの方が使いやすいので、query() の使用は保留。

さらに追記── AS の使用 (080701)

もしかしたら、下記でいけるかもしれない。未確認。そのうち試してみよう。

$this->User->query('SELECT DISTINCT column FROM prefix_users AS User ORDER BY forSortColumn ASC');

Tail-Lagoon @ 15:39   |   PageUp

MySQL よく使うコマンド »

MySQL

  • ログイン
    mysql -u USERNAME -p;
    ユーザ名 USERNAME でパスワードオプション付きでログイン
  • データベース作成
    create database DB-NAME character set utf8;
    DB-NAME というデータベースを、使用する文字コード UTF-8 と指定して作成
  • データベース削除
    drop database DB-NAME;
    DB-NAME というデータベースを削除
  • データベースの一覧
    show databases;
  • データベースの選択
    use DB-NAME;
  • TABLE情報表示
    show table status;
    テーブルの型などが知りたい場合もこれで分る
  • TABLE作成時のクエリ表示
    show create table TBL-NAME;
    新たにテーブルを作る時や、同じカラムを持つテーブルを作りたい時など参考になる
  • カラム情報表示
    show columns from TBL-NAME;
  • 全データ表示
    select * from TBL-NAME;
  • 新規レコード作成
    insert into TBL-NAME set ID=0,TITLE='あああ',BODY='いいい';
    (ID, TITLE, BODY という名の各カラムがあると想定)
  • レコード削除
    delete from TBL-NAME where ID=0;
    ID の値が 0 のレコードを消去
  • キーワードを重複なしで表示
    select distinct KEYWORDS, KANA from TBL-NAME order by KANA;
    KEYWORDS カラムの値と KANA カラムの値を重複なしで表示し、表示順は KANA カラムの値でソート
  • オートインクリメント(自動連番)カラムの値を振り直す場合、下記の手順で実行する(例では ID カラムがこれに該当)
    1. ID カラムを削除
      alter table TBL-NAME drop column ID;
      オートインクリメント・カラムは各テーブルに一つだけしか作成できないので、連番を振り直す場合は、一旦カラムを削除して新たに作り直す必要がある
    2. 新規 ID カラム(整数型・自動連番)を追加
      alter table TBL-NAME add ID int(5) primary key not null auto_increment first;
      primary key は重複を許さない主キーのことであり、NOT NULL でなければならない
  • カラム名を変更する
    alter table TBL-NAME change OldColumnName NewColmunName DataType;
    (データタイプについては調べること)
  • レコードを変更する
    update TBL-NAME set ColumnName='New Data' [, ColumnName='New Data'] where … ;
    (where 以下の条件文を指定しない場合は、全レコードが書き換えられる)

Tail-Lagoon @ 17:54   |   PageUp