残念ながら、あなたが見ている投稿は間違っています。MySQL のドキュメントでは、句group by
で指定されていない場合、列の任意の値を選択すると明示的に述べています。group by
hereからの明示的な引用は次のとおりです。
MySQL は GROUP BY の使用を拡張して、選択リストが GROUP BY 句で指定されていない非集計列を参照できるようにします。これは、前述のクエリが MySQL で有効であることを意味します。この機能を使用すると、不要な列の並べ替えやグループ化を回避してパフォーマンスを向上させることができます。ただし、これは主に、GROUP BY で指定されていない各非集計列のすべての値が各グループで同じである場合に役立ちます。サーバーは各グループから任意の値を自由に選択できるため、それらが同じでない限り、選択された値は不確定です。さらに、各グループからの値の選択は、ORDER BY 句を追加しても影響を受けません。結果セットの並べ替えは、値が選択された後に行われます。ORDER BY は、サーバーが選択する各グループ内の値には影響しません。
正しいアプローチ (標準 SQL) は、適切な最大タイム スタンプを計算し、結果を結合することです。
SELECT t.*
FROM table_name t join
(select name, year, category, max(timestamp) as maxts
from table_name
WHERE year ='2013' AND category='Network'
group by name, year, category
) tn
on t.name = tn.name and
t.year = tn.year and t.category = tn.category and t.timestamp = tn.maxts
ORDER BY sales_total DESC;
編集:
これはあなたのクエリです:
SELECT t.*
FROM annualtable t join
(SELECT year, name, max(countries)
FROM annualtable
WHERE name NOT LIKE '%No Entries%' and year <> '0'
GROUP BY year
ORDER BY year
) tn
on t.name = tn.name and t.year = tn.year t.countries = tn.countries
ORDER BY year DESC;
2 つの問題があります。1 つは、and
の 3 番目の句の前にありませんon
。2 つ目は、サブクエリname
のforに含める必要があることです。が何かをgroup by
することを期待している場合は、別の問題が発生する可能性があります。order by
ドキュメントの上記のリファレンスを参照してください。したがって、これが必要になる場合があります。
SELECT t.*
FROM annualtable t join
(SELECT year, name, max(countries)
FROM annualtable
WHERE name NOT LIKE '%No Entries%' and year <> '0'
GROUP BY year, name
) tn
on t.name = tn.name and t.year = tn.year and t.countries = tn.countries
ORDER BY year DESC;