• ベストアンサー

フィールドを結合して検索するには

フィールドA B Cを結合してある文字列として検索したいです。 フィールドタイプは↓です。 A:datetime型 B:datetime型 C:int(11)型 フィールドA B Cを結合する方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

やりたいことを例を示してもっと具体的に質問してくれれば、方法の提案もできるのですけどね。。。 >Cはintで11桁あるのですが1桁しか入っていない場合あります。 >その場合、CONCATで3つをくっつけると桁数が違ってしまうのですが・・・。 「CAST(C CHAR(1))」と、1バイトの文字に変換してから、文字連結しましょう。 SELECT CONCAT(A,B,CAST(C CHAR(1))) ~ といった感じです。 >できればパフォーマンスも期待したいところなのですが、 >ほかに方法はないでしょうか? 何をやりたいか、具体的に説明してください。 文字連結など、列を加工した形で検索条件を指定した場合、その列にインデクスが定義されていても活用されません。 行値構成子(行値式)は、使用できないのでしょうか? WHERE (A,B,C) = ('2007-11-07 00:00:00',CURDATE(),1) といった検索条件の指定の仕方になります。

hiromu0103
質問者

補足

お知らせを一覧表示するようなものをPHPでつくっています。 DBはMYSQLです。 お知らせテーブルには A:表示する日付 B:登録した日付 C:ID(一意) を持っています。 お知らせを表示する順番としては 基本は表示する日付順。 もし、表示する日付が同じなら登録した日付順。 もしそれも同じなら、ID順。 としたいです。 一覧表示する際は、ORDER BY A DESC, B DESC, Cとしました。 お知らせの詳細ページには前後のお知らせにとぶリンクをつけます。 その前後のお知らせを取得するSQLで躓いています。 ・・・具体的にとはこのようでいいでしょか?

その他の回答 (3)

回答No.4

#2、#3です。 検索済の行を再表示しようとした場合、「他ユーザに削除されていたらどうするか?」といったことは検討されていますか? (1)そのユーザが接続されている間は、同じ表示結果を保証する。 (2)最新の情報を表示する。 →その場合、例えば「最初の表示時は10行あった」ものが、他ユーザに削除されて「9行しかない」といった状態になったらどう表示するか? などです。

回答No.3

#2回答者です。 結論から言うと、「フィールドを結合して検索」する必要は、まったくありません。 こういった操作は、「ページング」と呼ばれます。 MySQLはLIMIT句、OFFSET句を実装しているので、こういった操作には便利です。 SELECT * FROM tbl1 ORDER BY ソート指定 LIMIT x,n といった指定になり、xは開始位置(先頭行からの場合は、0)、nは検索する行数です。 この操作を行なう場合、活用できるインデクスがないと、母体件数に比例して性能が悪くなります。 そこで、一つ問題があります。 >一覧表示する際は、ORDER BY A DESC, B DESC, Cとしました。 A列、B列の降順はいいのですが、C列は昇順にする必要があるのでしょうか? MySQLでは、バージョン5.1でも、昇順と降順が混在するインデクスを実装していません。定義はできるのですが、実際にはすべての列が昇順のインデクスしか作成できません。 http://dev.mysql.com/doc/refman/5.1/ja/create-index.html このインデクスは、すべてのインデクス構成列が、昇順かまたは降順の場合に利用できます。 C列も降順でよく、MyISAMを利用できるなら、AUTO_INCREMENTも使用できます。 表定義は、次のような指定になります。 CREATE TABLE tbl1 (A DATE, B DATE, C INT AUTO_INCREMENT, PRIMARY KEY(A,B,C)) http://dev.mysql.com/doc/refman/4.1/ja/example-auto-increment.html C列を降順にできないなら、AUTO_INCREMENTを使用せず、負の数値を入れるといった方法を検討する必要があります。 例えば、下記のSQLを実行すれば、追加毎に「C列の最小値-1」を格納できます。 SET @A='2007-11-08'; SET @B='2007-11-08'; INSERT INTO tbl1 SELECT @A,@B,COALESCE(MIN(C),0)-1 FROM tbl1 WHERE A=@A AND B=@B; こうすることで、検索時はORDER BY指定をすべてDESCにでき、インデクスを活用できます。 select A,B,-C from tbl1 order by A desc,B desc,C desc limit 0,5 ;

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

CONCAT(A,B,C) ただ、まっとうなSQL処理ではないのでパフォーマンスは期待できません

hiromu0103
質問者

お礼

申し訳ありません。もうひとつ教えてください。 Cはintで11桁あるのですが1桁しか入っていない場合あります。 その場合、CONCATで3つをくっつけると桁数が違ってしまうのですが・・・。

hiromu0103
質問者

補足

ありがとうございます。 これから、試してみます。 できればパフォーマンスも期待したいところなのですが、 ほかに方法はないでしょうか?

関連するQ&A