• ベストアンサー

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

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

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

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

  • ベストアンサー
回答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

  • フィールドを結合して検索

    お世話になります。 データベースには、「name1」「name2」と 2つのフィールドに姓名が分かれて入っています。 検索で、「山田太郎」と入力されたとき、 「name1」「name2」を結合した列で抽出したいのですが どのようにSQLを書けばいいのでしょうか? よろしくお願いします。

  • 【エクセル】結合した文字列の検索について

    エクセルで、複数セルの文字列を「=A1&A2&A3&…」という感じで、B1セルに結合するとして、 例えばA2の文字列に「★」という文字が含まれているとします。 検索で「★」を指定した場合、A2のものは引っかかるのですが、B1の結合された文字列は引っかかりません。 B1セルの文字列も通常通り検索できるようにするには、B1セルでどのような処理をすれば良いのでしょうか。

  • ACCESSの文字列の結合について!

    AとBのふたつのフィールドがある場合、 A&Bで文字列の結合が出来る事は分かっています。 ところが、同一フィールドの文字列を結合する方法がわかりません。 現在はAというフィールドがある場合、 フォームフッターにフレームをつくり・・・・。 この時点で止まっています。 数値の場合はただたんに「=sum([A])で解決しますが、 文字列の場合はsumでは駄目なわけで・・・・。 ご指導の程宜しくお願いします。

  • 1つのテーブル・2つの列を結合して1つの検索結果に

    あるテーブルAがあり、そこにINT型の列bと列cがあるとします。 |b|c| |1|2| |1|3| とデータが格納されているとき、ここから[1,2,3]という風に、重複のない結合結果を出すにはどういったSQLを書けば良いでしょうか。 2列だとDISTINCTも使えず、簡単そうなのに自分ではできませんでした。出力後に結合するのでは色々と不都合なことがあったため、この出力が一発で出せれば便利だと思い質問させていただきました。ご回答よろしくお願いいたします。

  • EXELで文字列の結合はどのように

    EXELで文字列の結合方法を教えてください。 A列にある文字列とB列にある文字列を結合したものをC列に入れたいのです。 例えば、A列「JAS」、B列「-123」で、C列「JAS-123」 というようにです。 よろしくお願いします。

  • エクセルで、列内の連続した文字を一気に結合したい

    エクセルで、列内の連続した文字を一気に結合したい どういうことかといいますと、例えば列内に Aさん Aさん Aさん Aさん Bさん Bさん Bさん Bさん Bさん Cさん Cさん Cさん Cさん Cさん という列があったとして、セルの結合を行い、一度に Aさん Bさん Cさん という風にしたいのです。 簡単に行える方法はないでしょうか。 よろしくお願いいたします。

  • エクセルでセル結合関数

    以下のことをしたいのですが、 難しくてできません。 どなたか教えてください。 a1 b1 c1 a2 b2 c2 a3 a2 a3 (1)a列に「あ」と入力すると b1とc1セルが結合し、結合したセルに「-」が入る (2)a列に「い」と入力すると b列には自由に文字を入れられる c列には「う」が入る (3)a列にそれ以外がはいるとブランク (1)かつ(2)かつ(3)のことをしたいです。 おそらくc列に =if(a="あ",[b列セルとc列セルを結合した後、-を入力],if(a="い","う","")) だと思うのですが、 [b列セルとc列セルを結合した後、-を入力] がわかりません。 よろしくおねがいします。

  • アクセスの結合について

    お世話になります。 アクセスのクエリで、AテーブルのフィールドとBテーブルのフィールドを結合する際にAテーブルは「桜ヶ丘」でBテーブルは「桜ケ丘」・・・つまり大文字の「ケ」か小文字の「ヶ」の違いを区別しないで結合させることは出来るのでしょうか?基本的には同じでないと出来ないと思いますが、検索する時みたいに「大文字と小文字を区別しない」みたいな事なんですが・・・ お分かりになる方がいらしたらご教授ください。 よろしくお願い致します。

  • accessフィールドの複数結合

    テーブルAの1つのフィールドとテーブルB内の複数のフィールドを結合させたい。例 テーブルAには社員コードと社員名、テーブルBには商品名、納入社員コード、商品管理社員コード。テーブルAの社員コードフィールドとテーブルBの2つの社員コードフィールドを結合させたいのです。テーブルAをコピーして2つ作り、それぞれをBの2つのフィールドと結合すると出来るのですが、テーブルAが社員名でなく、画像だったりするととても大きなファイルサイズになってしまいます。お答えお待ちしています。

  • 異なる結合セルのコピー

    A.B.C列の結合セルに文字が入力されています。 その文字を違う表のD.Eの結合セルにコピーをしたいのですが、 「コピー領域と貼り付け領域が違う為コピーできません。」 というメッセージがでます。 A B C  ああ D E  ああ F列を作らないで出来る方法があれば、教えて下さい!! 宜しくお願い致します。