2010-12-14 9 views
1

そのクラスの中で最も人気のあるアイテムによって注文された一意の「クラス」のリストを返すクエリを書く必要があります。次のクエリの例を示します。GROUP BY&ORDER BY - 特定のフィールドで注文する

このクエリは正しいクラスを返しますが、返されるアイテムは最も一般的なものではなく表に最初に表示されます。

は同様に私が試してみました:

SELECT MAX(items.title), items.popularity 
FROM items, classes 
WHERE class_id = classes.id 
GROUP BY class_id 
ORDER BY MAX(items.popularity) DESC 

そして、すべてのバリエーション - これはただの追加、最新かつ最も人気のあるではないが返されます。

他の回答のlotslotsを読んだことがあります。

私は単純な答えがあると確信しています、助けてください!

+0

'ORDER BY MAX(items.popularity)DESC'は私にも意味をなさない... ORDER BYは列で並べ替えるべきであり、MAXはその列から単一の値を返します。一番上の「人気」が最も高いアイテムを手に入れるためには、「ORDER BY人気DESC」ではないでしょうか? – FrustratedWithFormsDesigner

+0

GROUP BYを使用すると、人気を無視してグループに向かう最も古いレコードをすべて選択するようです。 MAX関数を使用することは、多くの同様の質問に対する答えでした。 – Lisa

+0

通常、GROUP BYは、MAX、MIN、AVG、COUNTなどの分析を行うときに使用されます。通常、GROUP BYを使用して多数のレコードを1つまたは2つのレコードに集約/集約するため、 。私はあなたがその声明の意味を理解していないことを認めていますが、ORDER BYとGROUP BYの混乱を招くかもしれません。 – FrustratedWithFormsDesigner

答えて

0

私の推測では、MAX(人気度)を降順で並べ替える必要があります。クエリの最後にDESCを追加してみてください。

+0

申し訳ありませんが、文にDESCを追加しました。それは含まれているはずです。 – Lisa

0

あなたは既にどこ文で特定のクラスを選択しているとしてグループを必要はありません

SELECT MAX(items.title), items.popularity 
FROM items, classes 
WHERE class_id = classes.id 
GROUP BY class_id 
ORDER BY items.popularity DESC 
0
SELECT items.title, items.popularity 
FROM items, classes 
WHERE class_id = classes.id 
ORDER BY items.popularity DESC 

...私はそれを試していないが、私はそれが動作するはずだと思います。さらに、DESCの順序は、MAXを必要とせずに注文を処理する必要があります。

2

あなたはクラスから何も選択されていないので、そのテーブルは必要ありません。

select i.* 
from (
    SELECT class_id, max(popularity) as MaxPopularity 
    FROM items 
    GROUP BY class_id 
) ip 
inner join items i on ip.class_id = i.class_id 
    and ip.MaxPopularity = i.popularity 

注:同じ人気を持つクラスに複数の項目がある場合は、重複を得ることができます。

+0

私はサブクエリが唯一の答えかもしれないと思います - 私はこれを動作させることはできませんでしたが、あなたは正しい行にあります。 – Lisa