« Prev || 1 | 2 | 3 || Next »

超久々。MySQLのDELETE JOINについて。

カテゴリー
MySQL
投稿者
nonukes
コメント
書く

いやさあ、最近お仕事が忙しいというか、気が付きゃ復職して半年が過ぎて、かなり疲労が溜ってきてるのね。

家に帰ってまで仕事に没頭している訳ではないんだけど、家に帰るとどっと疲れが出て、帰ってまでパソコン触ろうという気になかなかなれなくてね。

前回のエントリから早1ヶ月。

さすがに、ちょっとは記事を書かないとね。

と、いうワケで、MySQLのDELETE文について書きます。

これまで、データベースからデータを削除する場合には、

DELETE FROM
  `table_name`
WHERE
  `id` = '{$id}'

てなカンジで、WHERE句にはそのテーブルに存在するカラムを直接指定していたが、今回の仕事では他の関連テーブルのカラムの値に基づいて削除する必要が生じた。

つまり、テーブルをJOIN句で繋がなければならないワケだが、ここで躓いた。

DELETE FROM
  `table_name1`
    INNER JOIN `table_name2`
    USING(`xxx`)
WHERE
  `id` = '{$id}'

なんとなく、上記のように単純にJOIN句をつけてみたが、ダメ。

途方に暮れる、、、ワケもなく、迷いなくgoogle先生に聞いてみた。

mysqlでdelete時のjoin
http://0-9.sakura.ne.jp/blog/archives/2008/07/10013846.html

DELETEとFROMのあいだのテーブル名は必須。

らしい。

つまり、

DELETE
  `table_name1`
FROM
  `table_name1`
    INNER JOIN `table_name2`
    USING(`xxx`)
WHERE
  `id` = '{$id}'

とすればいいワケか。

なるほど。

賢くなりました。

今日は、おしまい。

【MySQL】Error 1093 You can't specify target table 'xxx'

カテゴリー
MySQL
投稿者
nonukes
コメント
1件

You can't specify target table 'xxx' for update in FROM clause

のっけから、MySQLのエラー文である。

初めて目にしたエラー。

なんのことやら、さっぱり。

ググってみたら、出てくる出てくる。

MySQL 4.1 リファレンスマニュアル
http://dev.mysql.com/doc/refman/4.1/ja/subquery-errors.html

サブクエリは SELECT ステートメントと同じく、UPDATE ステートメントや DELETE ステートメントでも正式に使用できるので、UPDATE ステートメント内の割り当てにサブクエリを使用しても問題ありません。 しかし、サブクエリの FROM 節と更新対象の両方に同じテーブルを使用することはできません。

今回、僕がエラーに遭遇したクエリ文が、コレ↓

$sql = <<<SQL
UPDATE `{$tblname}`
SET `token` = 'logout_{$nowTime}'
WHERE `login_time` = (
  SELECT MAX(`login_time`)
  FROM `{$tblname}`
  WHERE `user_id` = '{$user_id}'
)
SQL;

そう、まさしく前回の記事“今日もMySQL。サブクエリ文について。”で書いた、サブクエリ文を用いたクエリ文である。

»Read More

今日もMySQL。サブクエリ文について。

カテゴリー
MySQL
投稿者
nonukes
コメント
書く

復職して、約2ヵ月。

なんとか、踏ん張っています。

最近ずっと、会員制サイトの構築に携わっていて、おかげでMySQLの知識が日に日に増えていっています。

今日は、サブクエリ文について。

以下のサイトは、サブクエリの“超簡単な”説明です。

サブクエリを使った検索条件の設定
http://www.dbonline.jp/mysql/select/index20.html

サブクエリとはSELECT文で取得した結果を他のSELECT文やUPDATE文の中で利用する使い方です。主にはWERE句の中で使用されることが多いのですがそれには限定されません。またサブクエリを利用できる文はSELECT文、INSERT文、UPDATE文、DELETE文、SET文、DO文のいずれかだけです。

まあ、WHERE句でちょっと複雑な検索条件を設定するときに便利かな?

僕の場合は、ログイン情報を取得する際に、次のようなクエリ文を発行した。

$sql = <<< SQL
SELECT `login_time`
FROM `{$tblname}`
WHERE `login_time` = (
  SELECT MAX(`login_time`)
  FROM `{$tblname}`
  WHERE `user_id` = '{$user_id}'
)
SQL;

ログイン/アウトの情報を格納しているテーブルにアクセスして、特定の`user_id`を持つ`login_time`の中から、最も値の大きいモノ、つまり最近のログイン時間を取得するときにこりゃ便利。

“忙しい”ってのはしんどいけど、精神が健全だとこうも充足感が得られるものなのかと、実感。

このまま、健全でいられますように。

しんどいから、寝る。

MySQLで“特殊文字”にハマった。。。

カテゴリー
MySQL
投稿者
nonukes
コメント
書く

最近ずっと、MySQL。

今日、ハマりました。

何気なく新規テーブルを作成してローカルサーバー(XAMPP)上で動作確認をしてみたところ、エラーが出た。

mysql_error()関数を使うと、エラーが出たSQL文の一部がそのまま表示されてしまいセキュリティー的に超NGなので、普段は使っていない。

しかしソースを見てもエラーの原因が皆目見当つかなかったので、ローカル環境においてmysql_error()関数を使ってエラーの内容を見てみた。

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '~' at line 1

なんじゃ、コリャ。

調べてみた。

»Read More

またMySQL。今日はキャスト関数“CAST( )”について。

カテゴリー
MySQL
投稿者
nonukes
コメント
書く

奥が深いデータベース。

知らないことばっか。

今日は簡単に、キャスト関数“CAST( )”について。

MySQL 4.1 リファレンス
http://dev.mysql.com/doc/refman/4.1/ja/cast-functions.html

CAST( ) 関数は、あるデータ型の値から別のデータ型の値を生成する目的で使用することができます。

構文は以下のとおりです。

CAST(expression AS type)

type には、次のいずれかのデータ型を指定できます。

・BINARY

・CHAR

・DATE

・DATETIME

・SIGNED {INTEGER}

・TIME

・UNSIGNED {INTEGER}

»Read More

« Prev || 1 | 2 | 3 || Next »
track feed