• 締切済み

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

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とかを使って条件文をかけばいいのでしょうか? 足らずの情報があればおっしゃってください。 何卒ご教授お願いいたします。

みんなの回答

  • 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