4

データベースにニュース記事のカテゴリを格納するテーブルがあり、ユーザーが記事を読むたびに、関連する列の値が増加します。このような:

ここに画像の説明を入力

ここで、各レコードの 4 つの最大値を持つ列名を取得できるクエリを実行したいと考えています。たとえば、ユーザー 9 の場合、次のように返されます。

ここに画像の説明を入力

いろいろ試したり、いろいろ調べたりしましたが、やり方がわかりません。誰でも私を助けることができますか?

4

4 に答える 4

4

これはそれを行う必要があります:

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

デモ: http://www.sqlfiddle.com/#!2/ff624/11

于 2012-05-24T18:34:12.530 に答える
1

これを行う非常に簡単な方法を以下に示します

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;
于 2012-05-25T04:03:52.287 に答える
0

PL / SQL、多分?user_idを設定し、テーブルにクエリを実行し、返された行を列名と値のnx2配列(nは列の数)に格納し、値に基づいて配列を並べ替えます。

もちろん、正しいことは、@octernが提案する方法でデータベースを再設計することです。

于 2012-05-24T18:43:25.897 に答える
0

これにより、単一の行の複数の列から最高値を取得するという概念から始めることができます (特定のテーブルに合わせて変更してください - 私は偽物を作成しました)。

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
于 2012-05-24T19:52:13.447 に答える