【最大10000ポイント】当たる!!質問投稿キャンペーン!

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

フィールドA B Cを結合する方法を教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

やりたいことを例を示してもっと具体的に質問してくれれば、方法の提案もできるのですけどね。

。。

>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)

といった検索条件の指定の仕方になります。

この回答への補足

お知らせを一覧表示するようなものをPHPでつくっています。
DBはMYSQLです。
お知らせテーブルには
A:表示する日付
B:登録した日付
C:ID(一意)
を持っています。

お知らせを表示する順番としては
基本は表示する日付順。
もし、表示する日付が同じなら登録した日付順。
もしそれも同じなら、ID順。
としたいです。

一覧表示する際は、ORDER BY A DESC, B DESC, Cとしました。

お知らせの詳細ページには前後のお知らせにとぶリンクをつけます。
その前後のお知らせを取得するSQLで躓いています。


・・・具体的にとはこのようでいいでしょか?

補足日時:2007/11/07 18:41
    • good
    • 0

#2、#3です。



検索済の行を再表示しようとした場合、「他ユーザに削除されていたらどうするか?」といったことは検討されていますか?

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

などです。
    • good
    • 0

#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-in …

このインデクスは、すべてのインデクス構成列が、昇順かまたは降順の場合に利用できます。
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-a …


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
;
    • good
    • 0

CONCAT(A,B,C)



ただ、まっとうなSQL処理ではないのでパフォーマンスは期待できません

この回答への補足

ありがとうございます。
これから、試してみます。


できればパフォーマンスも期待したいところなのですが、
ほかに方法はないでしょうか?

補足日時:2007/11/07 17:45
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/11/07 17:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング