データベースにニュース記事のカテゴリを格納するテーブルがあり、ユーザーが記事を読むたびに、関連する列の値が増加します。このような:
ここで、各レコードの 4 つの最大値を持つ列名を取得できるクエリを実行したいと考えています。たとえば、ユーザー 9 の場合、次のように返されます。
いろいろ試したり、いろいろ調べたりしましたが、やり方がわかりません。誰でも私を助けることができますか?
これはそれを行う必要があります:
select
userid,
max(case when rank=1 then name end) as `highest value`,
max(case when rank=2 then name end) as `2nd highest value`,
max(case when rank=3 then name end) as `3rd highest value`,
max(case when rank=4 then name end) as `4th highest value`
from
(
select userID, @rownum := @rownum + 1 AS rank, name, amt from (
select userID, Buitenland as amt, 'Buitenland' as name from newsarticles where userID = 9 union
select userID, Economie, 'Economie' from newsarticles where userID = 9 union
select userID, Sport, 'Sport' from newsarticles where userID = 9 union
select userID, Cultuur, 'Cultuur' from newsarticles where userID = 9 union
select userID, Wetenschap, 'Wetenschap' from newsarticles where userID = 9 union
select userID, Media, 'Media' from newsarticles where userID = 9
) amounts, (SELECT @rownum := 0) r
order by amt desc
limit 4
) top4
group by userid
これを行う非常に簡単な方法を以下に示します
select userId, substring_index(four_highest,',',1) as 'highest value', substring_index(substring_index(four_highest,',',2),',',-1) as '2th highest value', substring_index(substring_index(four_highest,',',3),',',-1) as '3 rd highest value', substring_index(four_highest,',',-1) as '4th highest value' from
(
select userid, convert(group_concat(val) using utf8) as four_highest from
(
select userId,Buitenland as val,'Buitenland' as col from test where userid=9 union
select userId,Economie as val,' Economie' as col from test where userid=9 union
select userId,Sport as val ,'Sport' as col from test where userid=9 union
select userId,Cultuur as val,'Cultuur' as col from test where userid=9 union
select userId,Wetenschap as val,'Wetenschap' as col from test where userid=9 union
select userId,Media as val,'Media' as col from test where userid=9 order by val desc limit 4
) inner_query
)outer_query;
PL / SQL、多分?user_idを設定し、テーブルにクエリを実行し、返された行を列名と値のnx2配列(nは列の数)に格納し、値に基づいて配列を並べ替えます。
もちろん、正しいことは、@octernが提案する方法でデータベースを再設計することです。
これにより、単一の行の複数の列から最高値を取得するという概念から始めることができます (特定のテーブルに合わせて変更してください - 私は偽物を作成しました)。
create table fake
(
id int Primary Key,
col1 int,
col2 int,
col3 int,
col4 int
)
insert into fake values (1, 5, 9, 27, 10)
insert into fake values (2, 3, 5, 1, 20)
insert into fake values (3, 89, 9, 27, 6)
insert into fake values (4, 17, 40, 1, 20)
SELECT *,(SELECT Max(v)
FROM (VALUES (col1), (col2), (col3), (col4) ) AS value(v))
FROM fake