• 締切済み

SQL文でIF文のような条件分岐を行いたい

SQL文で、いわゆるIF文のような動作を行いたいのですが、 調べてもいまいちわからなかったので質問させてください。 name、mail、ageフィールドがあり、いくらかのレコードが入っています。 sa  sa@a.com 11 si  sa@a.com 12 su  sa@a.com 13 se  sa@a.com 14 so  sa@a.com 15 ここに、次の3つのレコード(nameはnull)    sa@a.com 21    si@a.com 22    su@a.com 23 を挿入しようと思います。 挿入レコードのmailフィールドの値が、すでに登録済みのあるレコードの値と同じなら、 このレコードに対して、新しいデータをUPDATEします。 登録済みのレコードに対して、 挿入するレコードにあるデータ(この場合はage)はUPDATEし、 挿入するレコードにないデータ(この場合はname)はそのまま更新します。 mailが違うなら、そのままINSERTを行います。 上の例だと実行結果は sa  sa@a.com 21 si  si@a.com 22 su  su@a.com 23 se  se@a.com 14 so  so@a.com 15 となるのですが、このようなSQL文を教えてください。

  • MySQL
  • 回答数3
  • ありがとう数0

みんなの回答

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.3

このテーブルの主キーはなんですか。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

なんか回答の表現がわるかったのかうまく表示されないようなので 表現を変えて再投稿 create table hoge(name varchar(20),mail varchar(20) not null unique key,age int); insert ignore into hoge values('sa','sa-xxxx',11),('si','si-xxxx',12),('su','su-xxxx',13),('se','se-xxxx',14),('so','so-xxxx',15); insert into hoge(mail,age) values('sa-xxxx',@age:=21) on duplicate key update age=@age; insert into hoge(mail,age) values('si-xxxx',@age:=22) on duplicate key update age=@age; insert into hoge(mail,age) values('su-xxxx',@age:=23) on duplicate key update age=@age; insert into hoge(mail,age) values('ka-xxxx',@age:=10) on duplicate key update age=@age;

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

質問の例示でmailの内容が間違えてますね。 とりあえず拡大解釈するとして・・・ insert on duplicate構文をつかいます http://dev.mysql.com/doc/refman/5.1/ja/insert-on-duplicate.html //準備 create table hoge(name varchar(20),mail varchar(20) not null unique key,age int); insert ignore into hoge values( 'sa','sa@a.com',11),( 'si','si@a.com',12),( 'su','su@a.com',13),( 'se','se@a.com',14),( 'so','so@a.com',15); //insert & update insert into hoge(mail,age) values('sa@a.com',@age:=21) on duplicate key update age=@age; insert into hoge(mail,age) values('si@a.com',@age:=22) on duplicate key update age=@age; insert into hoge(mail,age) values('su@a.com',@age:=23) on duplicate key update age=@age; insert into hoge(mail,age) values('ka@a.com',@age:=10) on duplicate key update age=@age;

関連するQ&A

  • 基本的なSQL文

    とても基本的なことだと思うのですが、以下のようなテーブルがあるとします。 create table test ( id numeric primary key, name varchar(45), age numeric ); これに例えば以下のようにデータを詰めたとします。 +----+----------+------+ | id | name | age | +----+----------+------+ | 1 | takeshi1 | 50 | | 2 | takeshi2 | 25 | | 3 | takeshi3 | 30 | | 4 | takeshi4 | 35 | | 5 | takeshi5 | 40 | | 6 | takeshi6 | 45 | +----+----------+------+ ここで最年少のレコードを取り出したいだけなのですが mysql> select id, name, min(age) from test;とすると +----+---------+----------+ | id | name | min(age) | +----+---------+----------+ | 1 | takeshi1| 25 | +----+---------+----------+ 年は最年少が取り出されますがidとnameは一行目が取り出されているようです。どのようなSQLを書けば以下のようになるのでしょうか。 +----+---------+----------+ | id | name | min(age) | +----+---------+----------+ | 2 | takeshi2| 25 | +----+---------+----------+

    • ベストアンサー
    • MySQL
  • さしすせそについて

    ローマ字で書いたとき、 sa, shi, su, se, so となりますが、音韻的に正しく50音を書くと、 sa, ×, su se, so で、si の部分は空白で、そして、 sha, shi, shu, she, sho とするべきではないでしょうか? この辺のことに関して、なにか参考になる本やサイトがあればお教えください。

  • 簡単なif文でちゃんと分岐しません

    今参考書を見ながらやっていますがうまくいきません。 postからusernameとpasswordの値を受け取って処理する スクリプトなんですが、うまく作動してくれません。 ■問題点 分岐点が4箇所ありますが、 パスワードだけ間違っても、すべて■1■ ログイン処理状態になります。 どうしてもパスワード再設定の画面に切り替わりません。 入力されたデータはデータベースにきちんと入ります。 3日間これで悩んでいて、ついに投稿してみました。 こんなこともわからない私ですが なんとかお願い致します。 ----ここから---- <?php session_start(); $username = $_POST["username"]; $sql = "SELECT * FROM `art_users` WHERE `user_name` = '%{$username}%'"; $query = mysql_query($sql) or die("データ追加エラー" . mysql_error()); $record = mysql_fetch_array($query, MYSQL_ASSOC); if ( $_POST["mode"] == "login" && mysql_num_rows($query) > 0 && $_POST["password"] == $record["user_password"] ) { $_SESSION["userid"] = $record["user_id"]; header("Location: kaukau_top.php"); } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>ログイン処理</title> </head> <body> <?php // ■1■ ログイン処理状態 if ( $_POST["mode"] == "login" ) { // 新規登録:クエリ実行結果が0行=既存ユーザー名と一致しない if ( mysql_num_rows($query) == 0 ) { echo '新規ユーザー登録<br>'; echo '<form action="kaukau_login.php" method="POST">'; echo '<input type="hidden" name="mode" value="register">'; echo '<input type="submit" value="登録">'; echo '</form>'; } // パスワードミス:クエリ実行結果のパスワードと入力されたパスワードが一致しない elseif ( $_POST["password"] != $record["user_password"] ) { echo 'パスワードが違います。<br>'; echo 'ひみつの質問に答えると、パスワードを変更できます。<br>'; echo '<form action="kaukau_login.php" method="POST">'; echo '<input type="hidden" name="username" value="' . $username . '">'; echo '<input type="hidden" name="mode" value="resetpassword">'; echo '<input type="submit" value="送信">'; echo '</form>'; } } // ■2■ パスワード再設定状態 elseif ( $_POST["mode"] == "resetpassword" ) { if( $record["user_answer"] == $_POST["answer"] ) { echo 'パスワード再設定<br>'; echo '<form action="kaukau_login.php" method="POST">'; echo '<input type="hidden" name="username" value="' . $username . '">'; echo '<input type="hidden" name="mode" value="modifypassword">'; echo '<input type="submit" value="登録">'; echo '</form>'; } else{ echo "ひみつの答えが違います"; } } // ■3■ 新規ユーザー登録状態 elseif ( $_POST["mode"] == "register" ) { if( $_POST["password"] == $_POST["confirm"] ) { $sql = "INSERT INTO users (user_name, user_password, user_question, user_answer) VALUES ("; $sql .= " '" . $_POST["username"] ."',"; $sql .= " '" . $_POST["password"] ."',"; $sql .= " '" . $_POST["question"] ."',"; $sql .= " '" . $_POST["answer"] ."')"; $result = mysql_query($sql); echo '登録しました。'; } else { echo 'パスワードを再確認してください。'; } } // ■4■ パスワード変更状態 elseif ( $_POST["mode"] == "modifypassword" ) { if ( $_POST["password"] == $_POST["confirm"] ) { $sql = "UPDATE users"; $sql .= " SET user_password = '" . $_POST["password"] . "'"; $sql .= " WHERE user_name = '" . $_POST["username"] . "'"; mysql_query( $db, $sql ); echo '登録しました。'; } else { echo 'パスワードを再確認してください。'; } } ?> </body> </html>

    • 締切済み
    • PHP
  • SQL文の書き方

    SQLを勉強しています。 レコードの中で指定フィールドの文字列が、指定文字から始まるレコードを取り出したいのですがSQL文の書き方がわかりません。 例) 1, AAA 2, BBB 3, CCC 4, ABC 上記の4つのレコードから"A"から始まるレコードを取り出したい。 結果は[1, AAA]と[4, ABC]が欲しいのです。

  • Oracl の SQL文について

    Oracl の SQL文について、教えて下さい。 [A]テーブルに [CODE] と [NAME]フィールドがあるとします。 内容は、 A-1 NAME-1 A-2 NAME-2 A-3 NAME-3 と、します。 [B]テーブルに [CODE] と [DATE] と [MONEY] フィールドがあるとします。 内容は、 A-1 2005/01/01 100 A-1 2005/01/02 200 A-2 2005/01/01 300 A-2 2005/01/10 400 A-2 2005/12/10 500 と、します。 [DATE]の条件を、2005/01/01~2005/01/31とし、結果を A-1 NAME-1 300 A-2 NAME-2 700 と、なる様にする為には、どういうSQL文を書けば良いのでしょうか ? よろしくお願い致します。

  • 複数の表の条件でのDELETE文

    Oracleを使用しているのですが SQL文の書き方がわからなくて困っています。 A,Bという2つの表があります。 A name | age | gender | hobby -------------------------- tom | 15 | male | music john | 23 | male | car kate | 8 | female | tv B name | age | gender ---------------------- john | 23 | male kate | 32 | female A.name=B.name and A.age=B.age and A.gender=B.gender 以外のものをA表から削除したいと思っています。 この例で言うとA表からjohn以外のものを削除したいと 思っています。 複数の表を結合した条件でのDELETE文の書き方が わからないため困っています。 ご教授ください。 よろしくお願いいたします。

  • SQL文 複数条件の場合の書き方

    初めて質問します。 下記のようなデータが存在します。 テーブルA NO DATE GYO 1 2010/12/01 1 1 2010/12/01 2 2 2010/12/01 1 2 2010/12/01 2 2 2010/12/01 3 3 2010/12/02 1 <= 4 2010/12/03 1 4 2010/12/03 2 上記データにて、<=の行の値を取得し変数へ代入したとします。 変数.NO =3 変数.日付 =2010/12/02 変数.GYO =1 上記、変数を元に1件前のレコードを抽出したいのですが SQL文でのいい方法がわかりません。 取得したいレコード 1 2010/12/01 1 1 2010/12/01 2 2 2010/12/01 1 2 2010/12/01 2 2 2010/12/01 3 どうかお願いいたします。

  • SQL文について質問があります。

    PostgreSQLのSQL文で質問があります。 kekktaテーブルの構成 ---------------------- name:varchar(64) score : int 4 day : date ---------------------- 現在kekkaテーブルには以下のレコードが格納されています。 ------------------------------- yamada| -2|2003-04-30 yamada|-16|2003-05-01 yamada| 3|2003-05-02 yamada|-23|2003-05-02 honda |-12|2003-05-10 yamada| 12|2003-05-15 yamada| -6|2003-05-20 yamada| -8|2003-06-01 ------------------------------- このレコードで 2003年5月のyamadaさんのレコードの最新日付からの scoreの合計を取得したいと考えています。 ---------------------------------- select name, sum(score) from kekka where name='yamada' and day like '2003-05%' group by name offset 0 limit 4; (このSQLはもちろんうまくいきません) ---------------------------------- <出力したい結果> name | sum(score) --------------------- yamada | -14 です。 SQLがうまくできません。 宜しくお願いいたします。

  • SQL文を教えてください

    A B C --------- 11 22 33 44 55 33 上記のように、同じ値を持つレコードが2件以上あるC列の値を取得するにはどのようなSQL文にすればよいでしょうか。 よろしくお願いします。

  • SQL(SELECT文)を教えてください

    SQL Serverを勉強中です。 以下のようなテーブルに、同一の日付に複数の名称・値のセットが存在します。 Date(日付)  Name(名称) Value(値) 20130101      a      10 20130101      b      20 20130101      c      30 20130202      a      5 20130202      b      10 20130202      c      15 このデータを、SQLのSELECT文で取得し、以下のような表を作りたいと考えています。 a b c 20130101 10 20 30 20130202 5 10 15 行が日付、列が名称になっています。 このように取得できるSQL文を教えてください。よろしくお願いします。