• 締切済み

条件によってレコードを取得したい

Mysqlで以下のような条件のSQL文がわかりません。 hogeというフィールドの値に1があればそのレコードを取得 hogeに1という値のフィールド値をもったレコードがないならhogeが空のレコードを取得したいのですが方法がわかりません。 SELECT * FROM `tebleA` where (`hoge` = '1') or `postageFee_memId` = '' LIMIT 5 上のSQL文ではどうしても「`postageFee_memId` = '' 」のほうが優先されます。 (優先されるのはオートインクリメントIDが小さいから当然ですが・・) 「`hoge` = '1'」が絶対優先されるようにしたいのです。 いわゆる 「`hoge` = '1'」がない場合だけ「`postageFee_memId` = ''」が実行できればと思います。 ifとかを使って条件文をかけばいいのでしょうか? 足らずの情報があればおっしゃってください。 何卒ご教授お願いいたします。

  • MySQL
  • 回答数4
  • ありがとう数2

みんなの回答

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.4

>(優先されるのはオートインクリメントIDが小さいから当然ですが・・) というのは本当かな? DBに関する一般論では、select文で、order byをつけなければ出力される順番は不定 (というかどういう順番で出てきてもいいはずですが。) 極端なことをいうと、毎回違う順番で出てきても正しいのですが。 (mySQL独自の仕様で、出てくる順番を規定しているならその仕様をみてください。) ということで、limit 5を使っているのにOrder byを指定していない時点でおかしい。 ということがいえます。 >(優先されるのはオートインクリメントIDが小さいから当然ですが・・) ということなら、order by オートインクリメントID desc とする考え方もあります。 ⇒お薦めできない方法です! 会員の初期値的な設定レコードがオートインクリメントIDが小さいのは当然という前提になりますが、 初期値を修正したときに、delete&insertで処理すると、この状況が崩れるからです。 ということを考えて、 order by case when `hoge` is null then 0 when `hoge` = '1' then 1 else 0 end とかしておくと、お望みの順番になるかと。

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

いくつかポイントがあります まずhogeの型が重要です。それがないと「データが空」という状態が確定できません。 通常、値が1をフラグのように使うのであればintもしくはtinyintをつかいます。 くわえてデータが空を実現するにはNULLを設定します。 こんな感じ CREATE TABLE tableA (postageFee_memId INT NOT NULL UNIQUE,hoge INT NULL); これに参考データをいれてみます。 INSERT INTO tableA VALUES(1,1),(2,2),(3,0),(4,''),(5,NULL),(6,NULL),(7,NULL),(8,1); SELECT * FROM tableA をすれば解りますが、空のデータには「NULL」が登録され、 ''で指定したデータはは0が登録されます つまり数値型に''はあり得ないのです。 これを踏まえてhogeが1かNULLのものを1を優先して5データとるにはこんな感じです SELECT * FROM tableA where hoge = '1' or hoge IS NULL ORDER BY hoge=1 DESC,postageFee_memId ASC LIMIT 5 postageFee_memId |hoge 1|1 8|1 5|NULL 6|NULL 7|NULL 「ORDER BY hoge=1 DESC」というのがhogeが1だったらtrueになるためDESCを つかうと上にきます。 なおNULLと0は違うので0は抽出されません。 もちろんhogeが文字列型だと処理が変わるので注意してください

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

>「`hoge` = '1'」が絶対優先 優先の定義があいまいなので回答がしづらいです。 できればどういうデータ集合からどういう集計結果をほしいか、 具体的な例示があるとよいかと。

titikun00
質問者

補足

失礼いたしました。 すこし記述ミスがありましたので訂正 SELECT * FROM `tebleA` where (`hoge` = '1') or `postageFee_memId` = '' LIMIT 5 ↓ SELECT * FROM `tebleA` where (`hoge` = '1') or `hoge` = '' LIMIT 5 です。もちろん上のSQLは私が勝手に考えたものですからうまく処理してくれないものとしてご認識ください。 無数のレコードにはhoge(実際はmember_idとしています)のなかに数列が入ります。 もしhogeに1があるレコードがあればLimit5まで取得し、もしhogeに1がなければhogeに空のものを limit5取り出したいのです。 何がしたいかといいますと、`hoge` = ''は5つ最初からレコードがあり、会員の初期値的な設定レコードとしています。 会員が初めて初期設定する際に設定レコードがない場合はhoge=''の初期値を呼び込みたいのです。 ややこしい説明でもうしわけないです。 これでご理解いただけますでしょうか?

noname#217196
noname#217196
回答No.1

UNIONについて調べて、使ってみたらいいと思いますけど。

titikun00
質問者

補足

ありがとうございます。 UNIONですね。調べてみます。

関連するQ&A

  • テーブルの最後(最新)のレコードを抽出したい

    宜しくお願いします。 PHP MYSQL の組み合わせで使っています 以下のようにして、最後のレコードを取り出したいのですが まったく違う事をしているのかもしれません。 $sql =" select * from テーブル where フィールド='max' " ; フィールドはauto_incrementで番号を振っています。 これで最大のつもりなのですが・・・。 他にも、レコードを入れた時間も記録したフィールドがあるのですが どうしてよいか?判りません。 テーブルの最新のレコードを出したいのです。 **その中の一つのフィールドを取り出すのですが、   それはうまくいっているみたいです    (max の所に数字を入れると表示します) お手数かけますが、どなたかご教授お願いいたします。

    • ベストアンサー
    • MySQL
  • WHERE句内でプライマリキーの検査ができない

    こんにちは。mySQL初心者です。 例えば、「sample」というDBに以下の3つのフィールドのあるテーブル「text」があるとします。 (実際には、DATETIME型のフィールドも含めて20列あります) key => 整数型で、プライマリキー&オートインクリメントを設定 status => テキスト型(UTF-8) note => テキスト型(UTF-8) ここで、「SELECT * FROM text WHERE key=1」というSQLで1つ目のレコードを取得しようとすると、「#1064 - 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 'key=1 LIMIT 0, 30' at line 1」というエラーが出てしまいます。 「SELECT * FROM text WHERE status='sample_01'」や「SELECT * FROM text WHERE note='test entry'」というSQL文ならちゃんとデータを取得できるのですが、「WHERE key=1」のようにプライマリキーで検索しようとするとエラーになるのは何故でしょうか。 どなたか見当が付くかたがいらっしゃいましたら、教えていただけないでしょうか。 よろしくお願いします。 <環境> XAMPP Ver.1.7.4で、mySQLは Ver. 5.5.8です。

    • ベストアンサー
    • MySQL
  • レコードのリセットは可能ですか?

    初心者です。よろしくお願いします。 50個ほどのフイールドがあるレコードの中身(各フィールド)を一気に消すようなSQL文などありませんでしょうか? auto_incrementで割り振っているID以外の中身をNULLもしくは空白にしたいと思っています。 これは、UPDATE文で一つずつ削除していくしかないのでしょうか? よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • レコードが選択されないときの、置換ができません

    select max(COL_1) from TBL where COL2 = 'hoge'; というようなSQLがあり、この条件での選択されるレコードが存在しないとき max(COL_1)の値を"0"(ゼロ)にしたいのですが。。。 select nvl(max(COL_1),NULL,0) from TBL where COL2 = 'hoge'; と修正しても結果は変わらず「レコードが選択されませんでした。」 となってしまいます。 他にdecodeや、countも試したのですが、力量不足のため、上手くいきません。。 どなたかご教授願います。 Oracle 9i で SQL*Plus 使用しています。

  • オートインクリメントの最新の値

    いずれかの方法で、オートインクリメントで記録している数字の最新のものを取得したいです。 (PHP/MySQL) 考えているのは オートインクリメントのフィールドの中から一番大きいものを取得 という方法ですが、WHEREの条件式をどのように書けばいいかがわかりません。 また、他にいい方法があれば教えていただきたいです。

    • ベストアンサー
    • MySQL
  • MySQLのINSERT時にたまに重複になる

    下記の通り同じデータが無かった場合に限りインサートしています。 //同じデータが既にあるか確認 $sql = "select * from `reg_data` where "; $sql .= "`Date` = '".$date."' and "; $sql .= "`ID` = '".$id."' and "; $sql .= "`No` = '".$no."'"; $result = mysql_query($sql); $rows = mysql_num_rows($result); //データが0なら今日のレコード作成 if($rows == 0){ $sql = "insert into `reg_data` values('0', '".$date."', '".$id."', '".$no.")"; mysql_query($sql); } しかし、3%ぐらいの確立で重複インサートになってしまいます。 重複といっても 1個目のフィールドはAUTO_INCREMENTになっておりまして AUTO_INCREMENTの値が重複する事は無いです。 $date、$id、$noがまったく同じテーブルがいくつか重複した場合でも AUTO_INCREMENTの値は全て連番になっています。 重複インサートが発生しないよう改善するには どうしたら良いでしょうか。 日付を2フィールド目に書いているので 0時0分1秒辺りでインサートが集中してしまいます。 分散させられたら改善するような気がしますが いい案が思いつきません。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 複数の条件に該当する結果を、それぞれ2件ずつ取得したい

    こんにちは。 PostgreSQL 7でシステムを開発中ですが、同一テーブルから「列~の値が■のものを2件、列~の値が▲のものを2件、列~の値が●のものを2件、それ以外のものからランダムに2件を取得」したいのですが、実現できなくて困っています。 select * from table where culumn = 'data1' limit 2 union select * from table where culumn = 'data2' limit 2 というようなことなのですが、これでは「limit 2」でparse errorとなってしまいます。 できれば上記のSQL定義でビューを作りたいところなのですが、いい方法はないでしょうか? よろしくお願いします。

  • タイムスタンプ型を抽出条件に指定した場合のSQL

    タイムスタンプ型を抽出条件に指定した場合、どの様なSQL文を指定すれば良いでしょうか? 該当するレコードは確かに存在していますが、以下のSQL文では「空」になってしまいました。 【実行したSQL文】 SELECT フィールド FROM テーブル WHERE タムスタンプ型フィールド BETWEEN '2011-08-05 20:00:00' AND '2011-08-06 19:59:59' 何卒、ご教授頂ければと存じます。 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • MySQL 複合検索条件

    MySQLでひとつのテーブルの複数フィールドに値を設定してレコードを参照したい。 例えば、key-field-1 >= ??? と key-field-2 >= ???で key-field-1は主キーでkey-field-2は従属キーとし、key-field-1の条件に合うレコードで、次にkey-field-2の条件に合うレコードを見つけ、それ以降の全てのレコードを抽出したい。 select * from table-1 where key-field-1 >= ??? and key-field-2 >= ??? で検索すると 両方の条件を満たすレコードのみ検索される。 アドバイスを待っています。

  • 条件が合わなかった場合の処理の飛ばし方

    MySQLとphpの勉強中です。 コードは下記のようにしています。 SQL文の条件に合ったレコードがなければprintの箇所を表示させたくない場合はどのようにすれば良いでしょうか? $sql = 'SELECT * FROM game WHERE scorer LIKE '.$scorer;   print "条件の合うレコードがなければここを表示させたくない。"; foreach ($dbh->query($sql) as $row) { } ご存知の方いらっしゃいましたらご教示ください。 よろしくお願いします。

    • ベストアンサー
    • PHP