2016-11-30 12 views
1

テーブルから複数の値をフェッチしようとしていますが、GROUP BYは列の1つのみを対象としています。物事を単純化するために、私は、一例として、モックアップゲストブックのテーブルを使用します:複数の列を持つMySQL:GROUP

postNumber | user | text  | date | portal 
----------------------------------------------- 
1 | Michael  | "nice blog" | 10/12| fitness 
2 | Ronald  | "hello!" | 12/12| lounge 
1 | Michael  | "beautiful" | 05/11| pictures 
2 | Sandra  | "great pic" | 10/12| pictures 

のは、ゲストブックのフロントページには、最新のゲスト記事を印刷するが、唯一のポータル(フィットネス、ラウンジや写真)ごとにしなければならないと仮定しましょう。望ましい結果は次のようになります。

  • マイケル/ "素敵なブログ" /フィットネス
  • ロナルド/ "ハロー" /ラウンジ
  • とサンドラ/ "偉大PIC" /絵。

除外された投稿は、そのポータルの最新のものではないため、マイケル/「美しい」/写真です。

次のクエリは、より近代的なMySQLサーバで無効で、エラーは以下の投げ:

SELECT max(postNumber), user, text, date, portal FROM guestbook GROUP BY portal; 

GROUP BY句とに機能的に依存しない非集約列「database.table.columnName」を含みますGROUP BY句の列。これはsql_modeのと互換性がありません= ONLY_FULL_GROUP_BY

しかし、このより限定されたクエリは、以下の成果望ましい結果で動作しますが、それは私がいる何である残りの必要な列(ユーザー、テキスト、日付)、fecthすることはできません正確でトラブル:

SELECT max(postNumber), portal FROM guestbook GROUP BY portal; 

最初のクエリがGROUP BYにユーザー、テキストや日付を追加することによって固定することも可能であるが、そのような複合グループ化を行うと、もはやポータルごとに1つだけのエントリを取得しないだろう。

誰かがこの問題の解決策を持っている場合は、私が自分で解決策を見つけることができなかったか、オンライン調査を通じて解決策を見つけてください。

編集:私はのように、左側のテーブル(のみのポータルおよびポスト番号)から私に値を与えているJOIN RIGHTなど何もありませんし、不明な点が次のクエリを試みている理由:

'SELECT t1.portal, max(t1.postNumber) from guestbook t1 RIGHT OUTER JOIN (SELECT * from guestbook) t2 on t1.postNumber = t2.postNumber GROUP BY portal LIMIT ?'; 
+0

説明しているように(http://stackoverflow.com/questions/34115174/error-related-to-only-full-group-by-when-executing-a-query- [この回答に] ONLY_FULL_GROUP_BY無効にしてみてくださいすることができますin-mysql) – jonesy827

+0

私が知っているのは、私が知っている限り、only_full_group_byがデフォルトになっていることを理解しています。そうでないと、緩やかなランダムな結果が得られ、より頑丈なSQLを作成するのがベストです。可能であれば、私は新しいmySQLのデフォルト設定と互換性のあるソリューションを実装したいと考えています –

答えて

1

ます正しい軌道に乗って... ..あなたが欲しい、そして予選の日付を条件に、同じ元のテーブルに再加入記録何の根拠として、事前のクエリを実行していることは

select 
     PreQuery.Portal, 
     PreQuery.LatestPostNumber, 
     T2.User, 
     T2.Text, 
     T2.Date 
    from 
     (select 
       t1.Portal, 
       max(t1.PostNumber) as LatestPostNumber 
      from 
       GuestBook T1 
      group by 
       t1.Portal) PreQuery 
     JOIN GuestBook T2 
      on PreQuery.Portal = T2.Portal 
      AND PreQuery.PostNumber = T2.PostNumber 
+0

ありがとうDRapp。あなたのクエリ自体が私のlocalhost上で(おそらく私のせいで)「ゼロ」を返すのに対し、あなたの事例は私にとって明らかになったものです。私は余分な "AND"が必要でしたので、私のクエリは正しく結合されました。これまでのところ、期待される結果を返す現在のクエリです: 'SELECT t1.parentID、t1.imageFileExtension、t1.postNumber、t1.postBoardDirectory、t1.user FROM posts t1 JOIN(PBDとしてpostBoardDirectoryを選択し、GROUP BY PBDからMAXNUMとしてmax(postNumber))t1.postNumber = MAXNUMおよびt1.postBoardDirectory = PBD LIMIT 15 ';私が新しいクエリの問題に遭遇した場合は、この投稿 –

+1

@ R.M.Dを更新して助けてくれると嬉しく思います。また、これとあなたの他の質問に関するサイトエチケットのツアーを見てください。投稿が実際に働いた場合は、回答としてマークを付けるか、質問解決(このような)を直接手助けしてください。それから、他の人が同様の問題を抱えている場合、彼らは働いていたこととなぜそれが見えるでしょう。 – DRapp

+1

@ R.M.D、追加ポイント1つ。コードサンプルにはコメントを使用しないでください。元の投稿を編集して変更を加え、追加のフォローアップが必要な場合に備えて、変更を確認するようにコメントを追加してください。 – DRapp

1

次のクエリを試してみてください

SELECT * 
FROM (SELECT postNumber, 
      user, 
      text, 
      date, 
      @current_portal := portal, 
      @portal_rank := IF(@current_portal = portal and @portal_rank = portal, @portal_rank + 1, 1) AS portal_rank, 
     FROM guestbook 
     ORDER BY portal, date DESC) ranked 
WHERE portal_rank = 1) 

portal_rank変数を使用してポータルをランク付けし、ポータルと日付の順番で並べ替えます。 この方法では、すべてのポータルの最新のレコードのみを選択しています

このクエリは理解しやすく、代わりに変数を使用できるときには単一のテーブルで複数の結合を行う必要はありません。

portal_rankを使用してportal_rank = 1の条件を切り替えると、< = 3と言うと、クエリの変更を最小限に抑えてポータルごとに最新のレコードを3つ取得できます。

これが役に立ちます。

+0

この問題を処理する別の方法を示してくれてありがとう、これは優雅な解決策のようです –

関連する問題