-1

MySQL クエリに問題があります。私は次のことを行ってきました:mysqlテーブルから日付付きレコードの最新のセットを選択する方法と、私がやろうとしているのは、最も新しいレコードを選択し、sales_totalフィールドでソートすることです。したがって、最初に max(timestamp) で並べ替え、次に sales_total で並べ替える必要があります。上記のソリューションを次のように変更しました。

$query = "(SELECT * FROM (SELECT * FROM table_name WHERE year =\'2013\' AND category=\'Network\' ORDER BY timestamp DESC) as t1 GROUP BY name) ORDER BY sales_total DESC";
$result = mysql_query($query) or die("Query failed");

これは PHPMyadmin で完全に実行されますが、PHP スクリプトで同じクエリを実行しようとすると、Query Failed エラーが発生します。上記がPHPMyadminでは機能するように見えるが、PHPでは機能しない理由を知っている人はいますか?


私のPHPクエリは次のとおりです。

$query = "(SELECT * FROM (SELECT * FROM table_name WHERE category=\'Network\' ORDER BY timestamp DESC) as t1 GROUP BY name) ORDER BY sales_total DESC";
4

2 に答える 2

1

残念ながら、あなたが見ている投稿は間違っています。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;
于 2013-07-26T10:52:41.637 に答える