人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQLでのSQL文で思うようにクエリが作れないでいます。良かったらお知恵を貸して下さい。
2つのテーブルA、Bがあり、
Aのフィールドはsn(int)、Bsn(int)、time(datetime)
Bのフィールドはsn(int)、name(varchar)
それぞれsnが主キーで、テーブルAのBsnとテーブルBのsnが対応しています。
そこで、timeの新しい順に、nameを重複せずに取り出したいのですが、
SELECT DISTINCT B.name FROM A,B WHERE A.Bsn=B.sn ORDER BY A.time DESC
とやるとtimeの順番が正しくなりません。
どうすれば正しく取り出せるのでしょうか。

●質問者: wintarsnow
●カテゴリ:ウェブ制作
✍キーワード:BSN MySQL name SELECT SQL
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● kn1967
●10ポイント

SELECT DISTINCT B.name ,A.time FROM B LEFT JOIN A ON A.Bsn = B.sn ORDER BY A.time DESC

私見ですが、意味の違うフィールドが同じ名称であるというのは後々で取り扱いが面倒になる可能性がありますのでテーブルBのsnは最初からBsnという名称にしておくことをお勧めします。

◎質問者からの返答

ご助言ありがとうございます!

>後々で取り扱いが面倒になる

そうなのですか。次からは意識したいと思います。


2 ● K-OKU
●20ポイント

http://www.hatena.ne.jp/1093164297

MySQLでのSQL文で思うようにクエリが作れないでいます。良かったらお知恵を貸して下さい。 2つのテーブルA、Bがあり、 Aのフィールドはsn(int)、Bsn(int)、time(datetime) .. - 人力検索はてな

URLはダミーです。

distinct使用時にorder by句に使用したカラムをselectしないのはSQL違反なのでtimeもselectしたらうまくいくのではないでしょうか?

◎質問者からの返答

回答ありがとうございます!

>distinct使用時にorder by句に使用したカラムをselectしないのはSQL違反

そ、そうだったのですか。

でもtimeもSELECTすると、timeは値がユニークなので、nameが重複して出てきてしまうのです。

--

質問文では省略していて実際のカラム数も違うのですが、日記のDBでして、テーブルAはタイトルや本文の入ったデータ、テーブルBはカテゴリのリストになってます。

timeが書込時間、

nameがカテゴリ名です。

それで、メニューとしてカテゴリ名を表示したいのです。普通に表示するだけならカテゴリテーブルのnameをSELECTすれば良いだけの話なのですけど、新しい書込があるカテゴリの順番に並べたいのです。


3 ● piipo
●50ポイント

こんな感じで出ないですかね.

SELECT DISTINCT name FROM (SELECT A.time, B.name FROM A,B WHERE A.Bsn=B.sn) ORDER BY time DESC

手元に環境が無いので試せないです.違うかもしれません.

◎質問者からの返答

ありがとうございます!

でもサブクエリの部分で構文エラーになってしまいました。

あと明記するのを忘れていましたが、MySQLのバージョンは3.23.58です。


4 ● piipo
●50ポイント

再挑戦です.

今度はどうでしょうか?

SELECT DISTINCT B.name , MAX(A.time) time FROM A,B WHERE A.bsn=B.sn GROUP BY B.name ORDER BY time DESC;

◎質問者からの返答

出来ました!! ありがとうございます!

でもなんで出来たのかがわからないのでこの構文を勉強しなくては。

大変助かりました!!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ