0

私はデータと呼ばれるテーブルを持っています:

create table data
(
   ID int primary key,
   val varchar(50),
   forID int

   constraint fk_forID foreign key (forID) references otherTable(forID)
)

dataFrequencies というビューがあります

create view dataFrequencies (val, freq)
as select val, COUNT(*)
     from data
 group by val
 order by freq desc

私が欲しいのは、の上位 50 行にあるtableの行のサブセットです。datavaldataFrequencies

私の現在の解決策はやや回り道です。dataFrequencies の上位 50 行を含むテーブル topFifty を作成します。次に、データからすべてを選択するビュー topFiftyVals を作成しますが、テーブル topFifty の内部結合は除きます。

create table topFifty
(
   val varchar(50) primary key
)

insert into topFifty select val from dataFrequencies order by frequency desc limit 50;

create view topFiftyVals (ID, val, forID)
as select *
     from data d
inner join topFifty tf on d.val = tf.val

これを行う何らかの直接クエリ方法があると確信しています! 助けてくれてありがとう!

4

2 に答える 2

1

あなたはただできませんでした:

SELECT *
  FROM data
 WHERE val IN (SELECT val 
                 FROM dataFrequencies 
               ORDER BY frequency DESC 
               LIMIT 50);
于 2012-12-02T00:14:05.037 に答える
1

はい、直接の方法があります。それはあなたのビューのコードでtopFiftyVals、わずかに変更されています:

     select d.*, tf.freq
       from data d
 inner join ( select val, COUNT(*) AS freq
                from data
            group by val
            order by freq desc
               limit 50
            ) tf 
         on d.val = tf.val ;
于 2012-12-02T00:14:26.030 に答える