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
- 無精・短気・傲慢