2009-06-11 14 views
0

ヒッツ:明確な人気は、誰かがこのクエリで私を助けることができる

SELECT su.name,su.imdb , su.id, su.owner, COUNT(*) AS count 
FROM subhits AS h LEFT JOIN subtitles AS su ON h.subid=su.id 
WHERE su.added BETWEEN '" . $lweek . "' AND '" . $today . "' 
GROUP BY h.subid 
ORDER BY count DESC LIMIT 15 

RETURNS:

name   imdb   id owner count 
*Angels and Demons WTV /title/tt0808151/ 3337 3055 120 
Terminator Salvation 2009 /title/tt0438488/ 3539 26 120 
Friday The 13th-WTV  /title/tt0758746/ 3334 26 82 
Night at the Museum  /title/tt1078912/ 3548 7170 75 
*Angels and Demons WTV2 /title/tt0808151/  3512 12 10 

*重複しIMDB

をあなたはそれが同じIMDBで結果を返します見ての通り。 私は何をしたいのですか?最高のカウントを取得しますが、結果から最低のimdbカウントを除外します。

答えて

0

MySQLに関して私がOracleと比べて好きなのは、グループ化機能を使用せずにGROUP BYの他のフィールドを選択する方法です。以下のクエリはクエリーをとり、imdbでグループ化します。これは、最も多くのカウントを持つ一意のimdb(subselectの降順ソートの最初に表示される)を選択します。それを試し、あなたのために動作するかどうかを確認してください。

SELECT name, imdb, id, owner, count 
FROM 
(
SELECT su.name,su.imdb , su.id, su.owner, COUNT(*) AS count 
FROM subhits AS h LEFT JOIN subtitles AS su ON h.subid=su.id 
WHERE su.added BETWEEN '" . $lweek . "' AND '" . $today . "' 
GROUP BY h.subid 
ORDER BY count DESC 
) 
GROUP BY imdb 
LIMIT 15 
+0

私はその仕事をしました。大変ありがとうございます。 他の皆様に感謝します:) –

0

これを試してみてください:

SELECT su.name 
     , su.imdb 
     , su.id 
     , su.owner 
     , (SELECT COUNT(*) FROM dbo.subhits AS h WHERE h.subid = su.id) AS count 
    FROM dbo.subtitles AS su 
    ORDER BY count DESC LIMIT 15 

編集を:私はほとんど働いて解決策を持っていたが、行き詰まって提供される追加情報を使用して。クリスシンプソンの解答と部分解を組み合わせて、これを思いつきました。それは一時テーブルを避け、他のクリスが完了する時間がない欠けている部分を持っています。私はMSSQLでこれを構築しているので、MySQLで動くように調整が必要な場合があります。私はまたあなたのデータなしで情報が正しいことを保証することはできませんが、これは助けになるかもしれません。

SELECT a.id 
     , (SELECT su.name FROM dbo.subtitles su WHERE a.id = su.id LIMIT 1) 
     , a.imdb 
     , (SELECT su.owner FROM dbo.subtitles su WHERE a.id = su.id LIMIT 1) 
     , a.count 
    FROM 
     (
      SELECT su.id 
        , su.imdb 
        , COUNT(*) AS count 
       FROM dbo.subtitles su 
       INNER JOIN dbo.subhits sh ON su.id = sh.subid 
       GROUP BY su.id, su.imdb 
     ) a 
    INNER JOIN 
     (
      SELECT c.imdb 
        , MAX(c.count) AS maxCount 
       FROM 
        (
         SELECT su.id 
           , su.imdb 
           , COUNT(*) AS count 
          FROM dbo.subtitles su 
          INNER JOIN dbo.subhits sh ON su.id = sh.subid 
          GROUP BY su.id, su.imdb 
        ) c 
       GROUP BY c.imdb 
     ) b ON a.imdb = b.imdb AND a.count = b.maxCount 
    ORDER BY a.count DESC LIMIT 15 
+0

これは私のクエリがすることですが、重複した 'su.imdb'を返します。そのようなことは起こりたくありません。 とにかくありがとうございます –

+0

データ結果がどのように表示されるかについての詳細な説明で質問を更新できますか?私はimdbがタイトルによって一意であると思った。そうでない場合、imdbでグループ化すると、結果セットに含まれていないIDとタイトルを持つことができ、それらに関連するヒットも除外されます。私はこのクエリを書く方法があると確信していますが、あなたはデータから何を求めているのか、より良い説明が必要です。 –

+0

質問を編集しました。ありがとうございました –

0

私はこれを言うのは嫌ですが、これは一時テーブルが役立つかもしれないまれなケースの1つです。あなたはこの結果に置く場合:一時テーブル..into

select 
    imdb, 
    id, 
    count(*) as cnt 
from subtitles 
group by 
    imdb, 
    id 

を、あなたは、あなたが本当にしたい行を取得することができます:

select 
    t.imdb, 
    t.id, 
    t.cnt 
from MyTempTable t 
    inner join 
    (
    select 
     imdb, 
     max(cnt) as maxcnt 
    from MyTempTable 
    group by 
     imdb 
) as drv on t.imdb = drv.imdb and t.cnt = drv.maxcnt 

は、上記の結果を結合することができ..and再度グループ化することなくメインテーブルに戻ってください。

これは役に立ちますか?

私はすべてのSQLを入れていないが、私は時間を押しています。これはあなたが望むことをしますが、カウントが同じであれば複製します。あなたが気にしている場合は、これに対処するためにクエリを修正することができます。

左のテーブルからデータを表示していないときに、なぜこのステートメントに参加する必要があるのか​​分かりません。

0

私はこれを自分でテストしようとしていますが、テストするデータやサンプルがありません。

SELECT su.name,su.imdb , su.id, su.owner, COUNT(*) AS counter 
FROM subhits AS h LEFT JOIN subtitles AS su ON h.subid=su.id 
WHERE su.added BETWEEN '" . $lweek . "' AND '" . $today . "' 
GROUP BY h.subid 
having max(counter) 
ORDER BY count DESC LIMIT 15 
関連する問題