2010年6月 8日

[mysql 15332] Re: 【お知恵拝借】副問い合わせに limit 3

坂井です

試行錯誤していたら、木村さんに先を越されてしまいました。
結果としてほとんど同じものなのですが、せっかくなので、
別解ということでメールします。

SELECT a.id, a.field, a.ordfield, COUNT(*)
FROM tbl a, tbl b

WHERE a.field=b.field
AND a.ordfield>=b.ordfield
GROUP BY a.id, a.field, a.ordfield
HAVING COUNT(*)<=3
ORDER BY a.field, COUNT(*);


WHERE に結合条件を書くのは最近あまりハヤりでない(結合条件は
JOINで明示したほうがわかりやすい)と聞いたことがありますが、
どうも私はこのほうが直感的なんですよね(^^;

#一応、要件に沿って ORDER BY しているところだけは胸を張れるかも。

#私は抽出フィールドとして COUNT(*) を書いてしまいましたが、
#明示しなくても HAVING 句やORDER BY 句の中で使用可能なんですね!

Thank you
On Mon, 07 Jun 2010 22:33:31 +0900
遠藤 俊裕 <endo@xxxxx> wrote:
> えんどうです。
> お返事有り難うございました。
>
> create table tbl
> (
> id int auto_increment primary key,
> field int,
> ordfield int
> );
>
> INSERT INTO `carelabo_portal`.`tbl`
> (`id`, `field`, `ordfield`) VALUES
> (NULL, '0', '1'), (NULL, '1', '11'), (NULL, '2', '55'),
> (NULL, '0', '2'), (NULL, '1', '22'), (NULL, '2', '66'),
> (NULL, '0', '3'), (NULL, '1', '33'), (NULL, '2', '77'),
> (NULL, '0', '4'), (NULL, '1', '44'), (NULL, '2', '88');
>
> で、実行した時、
>
> 1, 0, 1
> 4, 0, 2
> 7, 0, 3
> 2, 1, 11
> 5, 1, 22
> 8, 1, 33
> 3, 2, 55
> 6, 2, 66
> 9, 2, 77
>
> (おそらく)上記が出て欲しいです。
> データがダミーなので、おそらくと書きましたが、なんせ、グ
> ループ(field)毎に(ordfiledの)トップ3が出れば嬉しい
> のです。
>
> 今は、3回 SQL を( field 毎に)発行して、プログラムでがっ
> ちゃんこしてます。ちょっと、不細工・・・(^^;
>
> Mon, 07 Jun 2010 22:00:27 +0900 に、
> Miyata Masaki <catlover@xxxxx> さんは書きました:
>
> > ミヤタと申します。
> >
> > > どなたか、上記 SQL の結果を実現する方法をお教え下さい。
> >
> > 実現したい動作がよく分からないので、このあたりを付けて頂けると分り易いかと。
> > ・DDL文
> > ・INSERT文(数件程度)
> > ・想定結果
> >
> > --
> > Masaki Miyata
> > catlover@xxxxx
> >
> > > From: 遠藤 俊裕 <endo@xxxxx>
> > > To: ml@xxxxx
> > > Subject: [mysql 15328] 【お知恵拝借】副問い合わせに limit 3
> > > Date: 2010/06/07 21:41
> > >
> > > えんどうです。
> > >
> > > 皆様、お知恵を拝借させて下さい。
> > >
> > > tbl の中の field ごとに top 3 を出したいために、以下の SQL
> > > を書いてみました。
> > >
> > > select * from tbl as t1
> > > where id in
> > > (
> > > select id from tbl as t2
> > > where t1.field = t2.field
> > > order by ordfield
> > > limit 3
> > > )
> > > order by ordfield
> > >
> > > ダメでした。
> > >
> > > どうも、in の中で limit が使えない様です。
> > >
> > > どなたか、上記 SQL の結果を実現する方法をお教え下さい。
> > >
> > > 何卒よろしくお願い致します。
> > >
> > > MySQL version = 5.1.44
> > >
> > > --
> > > えんどう
> > > endo@xxxxx,endo@xxxxx
> > >
> > >
> >
>
> --
> えんどう
> endo@xxxxx,endo@xxxxx
>

--
SAKAI Kei <sak2@xxxxx>

投稿者 xml-rpc : 2010年6月 8日 00:47
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/96206
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。