ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

PostgreSQLコミュのselect文についてどなたか助けてはくれないでしょうか

  • mixiチェック
  • このエントリーをはてなブックマークに追加
select DISTINCT on(code) id,code,title from (table名) limit 5


にするとcodeが重複しない5つのデータが取り出せるのですが、id番号がバラバラになって出てきてしまいます。

これにidの大きい順(最新情報)取り出したいので「order by id」 を加えるとエラーになります。

調べると DISTINCT  と order byは一緒に使えないので 考え方を変えないとだめ・・というのはわかるのですが、いろいろチャレンジしてもうまくいきません。

どなたか ご指導いただけないでしょうか。

ああ、つくづく先生が欲しいです。。

コメント(32)

distinctの代わりにgroup byでまとめられませんか?
初心者が質問するときには、具体的なテーブルとデータと、試してみたSQLとその結果、そして実際に欲しい結果、この辺を書かないと厳しいよ
select id,code,title from (table_name)
where id IN (select DISTINCT on(code) id from (table_name))
order by id limit 5

こんな感じではないでしょうか?
要求してるものと違ったらごめんなさい。
ちば◎キック様
そうなんです。group byでまとめたりしたのですが、知識が浅はかなのかうまくいきませんでした。未熟ものです。。


あう様
かしこまりました。少し具体的に書いてみます。


スギモト様
初心者の自分には少し複雑なので、エラーが出ないものかとドキドキしながら試してみました。
結果、DESCを加えて、codeが重複することなく5つデータを取り出すことが出来ています(感動)!
・・・が、厳密に最新idを持ったcodeを取り出せていないようです。
しかし明らかに後半のデータは取り出せているので、もう少しで上手くいきそうなのです。
つたない説明でご助言下さりありがとうございます。
あう様  このような感じです。

id | code | title
------------------------------
201  natumi  bbbbb --?
200  yumiko  aaaaa
202  yumiko  ccccc --?
203  akiko   ddddd --?
204  hideki  eeeee --?
205  satosi  fffff
206  satosi  ggggg
207   satosi  hhhhh --?

分かりにくい図ですみません。
降順でcodeが重複しない5つのデータ(?〜?)を取り出したい。
yumiko やsatosiは複数あるので「idの一番大きいもの」1つだけを取り出せればいいです。

エラーメッセージは、昨日沢山だしてたのですが寝る前に消してしまいました。
(仕事終わってからしか出来ないので。。)
こんなメッセージとかも良くだしてました。
SELECT DISTINCT ON expressions must match initial ORDER BY expressions
なのでちば◎キック様 の言うようにgroup byを使う方法でなんやかんややったのですが駄目でした。
本を見てるんですけどこれという参考文書がありません。
頭のいい人であれば応用してやってしまうのかもしれません・・

まだまだつたない説明ですみません。

>あおきん 様

6:のものはやはり駄目でした。

しかし、8に書いてくださったものは・・見事に成功いたしました!!

感謝と感動で胸がいっぱいです。



kaz様 ponta様 今試していますので、また報告いたしますね。

取り急ぎご報告です。
kaz 様
ご指示通りやってみました。
素晴らしいの一言です。本当にちゃんと出来る方は出来るんですね。
尊敬します。

ponta様
おっしゃるとおりエラーは出ず、5つピックアップできました。
しかし、ID順とまではいかなかったです。


あおきん 様 kaz様 ponta様 
本当にありがとうございました。
苦しくなったらまた書き込みしてしまうかもしれませんが、もうちょっと自分で頑張れるように勉強します。
足跡ぺたっと残しますことお許し下さい。
>せっかくですから、後学のために負荷の事も考えてみたほうがいいかと。
ありがとうございます!
しっかり読んで勉強いたします。

>SQLチューニングの必要なほどシビアなことをされようとしている段階ではないように見えますので
そうなのです。
今の自分には「分かりやすい」ということが一番良いです。

しかし一日100件ぐらいの登録は今後ありますので、ponta様の言うとおりきちんと「想定されるデータ量を具体的にイメージ」したいと思います。
様々検討していただいた中で、皆様が良いというものを採用させていただきたいなと思います。

つくづく奥が深く、皆様よくよく考えて構築されているのだなと思いました。
すごく勉強になります。


お仕事影ながら応援しております
まだ出てないようなので、おまけでw 自己相関サブクエリ版です。

select
  id, code, title
from
  [table] as main
where
  id = (
    /* そのコードの中で一番大きいID */
    select
      id
    from
      [table] as sub
    where
      main.code = sub.code
    order by
      id desc
    limit 1
  )
order by id desc
limit 5
うわ、手厳しいですねー。
まあ、大凡おっしゃるとおりです。一部釈然としないところもありますが、別にいいです。

「こんな機能も!」といいいますか、今回与えられた問を一番素直にSQLに表わすと大体こんな感じかな、と思ったのでコメントさせていただきました。
また自己結合という、汎用性の高い構文を紹介したかったのもあります。

ご指摘ありがとうございました。
なんか横レスでサンプルも出さずに恐縮ですが
pontaさん
そういう書き込みは良くない。
ちなみにレコードが数十万を超えると、Distinctを使うだけで処理は遅くなります。
(例えindexを貼っていても)

パフォーマンス・チューニングについて調べると、最初の方に“Dirtinctを使わない“というのが出てきます。
更にチューニングはSQLの書き方だけでなく、DBやテーブル構造、インデックスの張り方で変わるので、書いたら実行計画を見ないとわかりません。

ちなみにポスグレは副問い合わせ(サブクエリー)は、比較的速いので、悪く無いかと。
今、携帯なんで実行計画見てませんのでご了承を。
個人的にはDISTINCTは不確定要素が性にあわないので、
専らGROUP BY派ですあせあせ

例えば、

SELECT * FROM "table"
WHERE id in (SELECT max(id) FROM "table" GROUP BY code)
ORDER BY id
LIMIT 5

ただ、場合によっては1発のSQL実行しない方法をとったり(view作成等)
低負荷SQL + プログラムで処理した方が良い場合もあります。

どちらにしろ、システム要件・規模やサーバ環境によりますかね。
ここmixi規模くらいになるとテーブル毎にDBが異なるものもありますからw
>kaz様 大丈夫ですよ。(というより、ここのコミュニティーは恐らく出来る方が沢山いらっしゃると思うので、自分の低スキルが恥ずかしいというか、具体的な考察結果とか書けないし・・すみませんって感じですので・・)

Take様 ponta様 ちば◎キック様ありがとうございます。
仕事だったら時間かけすぎ^^ですが、お勉強のうち・・ですので、今皆さんのサンプルをダーッと横並びにして眺めて考えてました(ほんとに様々なやり方があって面白いですね)。yoo様のサンプルですが、私的にはすごくシンプルで分かりやすいと思うのですが。如何でしょうか?

ただ、パフォーマンスという部分については、これまで自身あまり考えたことがないのでどうやって計っていいのか分かりません。(私はこれまで、CSE(commom SQL Enviroment)でチョコチョコしたDBしか扱ったことがありません)

ただSQLだけでなく「どんなコードでも自分が理解するのに時間がかかったり分かりにくかったりするなら、コンピュータも分かりにくいし処理に時間がかかる」ということも聞いたことあります(自分の知能にあわせていいものかとも思いますが・・・)

mixiって会員何人くらいいるんですかね。
テーブルってどんだけあるんだろ
mixiは500万人とか言われてましたね。
今はどれくらいなんでしょう。

テーブル数も会員の番号でグループ分けしてDBサーバ自体を分けたりしているようです。

WebDBプレスのバックナンバーなどにある程度書いてありますので、興味があるかたはどうぞ。

まあ、普通のサービスならmixiのノウハウはあまり必要無いとは思いますが。
>kaz様 初めて知りました。自分だけでやってたら一生気付かなかったかもしれません。ありがとうございます。でも「cost=XX.XX...XX.XX」沢山でてくるので・・正直申しますと素人目には・・なにか、こう、大した差には見えなかったです。。。
(やり手の方には「これ!」というもの(部分等)があるかもしれません;)

>ちば◎キック 様
そうなんです。あまり必要ないのですが、なんというか・・
同じ人間が作ってることだし、少し興味がありました。

こんばんは!

仕事が休みでほっと一息ついていることでしょう。

私はちょっと厳しいお客様の対応で、日曜の昼まで
見直し修正・・見直し修正・・と大変でした。

自分の力不足を痛感。

今回のトピック。
pontaさんのような方でも(ちょっとでも)勉強になったのなら
無駄ではなかったのかなと思ったり。

皆様のご健闘をお祈りします。

これで終了といたします。
ありがとうございました。
またお会いしましょう。

ログインすると、残り16件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

PostgreSQL 更新情報

PostgreSQLのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング