トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

SQL memo

カンマ区切りを縦展開する

select 部品名,仕様 from 部品 where 仕様 <> '';
+------+-------------------+
|部品名|仕様               |
+------+-------------------+
|山田 |リンゴ,葡萄,もも,柿|
|中山 |もも               |
|斎藤 |葡萄,柿            |
+------+-------------------+
select * from (
with recursive rec(部品名,item1,item2,仕様) as (
select 部品名,substr(仕様,1,locate(',',仕様) -1) as item1 
,substr(仕様,locate(',',仕様) +1,length(仕様)) as item2,仕様 from 部品
   where  仕様 <> ''
union all
select 部品名,substr(item2,1,locate(',',item2) -1) as item1 
,substr(item2,locate(',',item2) +1,length(item2)) as item2,item2 as 仕様 
from rec
   where item1 <> '')
select 部品名,case when item1  = '' then item2 else item1 end as item1 from rec
) m
+------+------+
|部品名|item1 |
+------+------+
|山田  |リンゴ|
|中山  |もも  |
|斎藤  |葡萄  |
|山田  |葡萄  |
|斎藤  |柿    |
|山田  |もも  |
|山田  |柿    |
+------+------+

Subject : [mysql 15783] カテゴリ毎の上位3件

こんばんは。shin1です。

価格データから、各カテゴリ毎の売価が安いものTOP3を一覧にしたいのですが、こういう項目のテーブルがあったとします。

create table saledata (
 saleid int auto_increment,
 category varchar(20),
 name  varchar(200),
 price  int,
 primary key (saleid)
);

他のエンジンなら、以下のような感じだと思うのですがMySQLではサブクエリのLIMITが使えないと知り、困っています。MySQLではこういう場合、どのように記述すれば良いのでしょうか。

select category, name, price from saledata AS t
 where saleid in (
  select saleid from saledata where category=t.category
  order by price asc limit 3
 )
order by category asc, price asc

たぶん、良くある例な気がしますが、ネットで探し当てられませんでした。よろしくお願い致します。

私の解

select a.saleid,a.category,a.name,a.price
       ,(select count(*)+1 from saledata b where b.category = a.category and b.price < a.price) rank
from saledata a
having rank <= 3
order by category,rank

サブセレクトが使えないMYSQL

select a.saleid,a.category,a.name,a.price,count(b.saleid)+1 rank
from saledata a
left join saledata b on
       (b.category = a.category and b.price < a.price)
group by a.saleid
having rank <= 3
order by a.category,rank