5

日付 ASC で並べ替えられたデータを出力する VIEW (多数の結合) があります。期待どおりに動作します。

次のような出力:

ID date         tag1   other_data
1  25-03-2011   blue   fff   <=
1  26-03-2011   red    ggg
1  27-03-2011   pink   yyy
2  25-03-2011   red    yyy   <=
2  26-03-2011   orange rrr

GROUP BY を適用するとID。その他の列については、MySQL は各 ID の最初に見つかった行を出力します。これは te docs のどこかで読みました。

SELECT * FROM `myVIEW`  
GROUP BY `ID`  
  ID date         tag1  other_data  
  1  25-03-2011   blue   fff   <=
  2  25-03-2011   red    yyy   <=

GROUP_CONCAT( tags1) を追加しましょう

SELECT *,CONCAT_GROUP(`tag1`) AS `tags`  
FROM `myVIEW`  
GROUP BY `ID`

CONCAT_GROUP を適用したため、結果が奇妙になります。私は期待していました:

ID date         tag1   other_data   tags
1  25-03-2011   blue   fff          blue,red,pink
2  25-03-2011   red    yyy          red,orange

クエリは次のように返されます。

ID date         tag1   other_data   tags
1  26-03-2011   red    ggg          blue,red,pink
2  25-03-2011   red    yyy          red,orange

GROUP_CONCAT が VIEW 順序を保持しなくなったようです。これは正常ですか?

4

3 に答える 3

5

GROUP_CONCATVIEW 順序が保持されなくなったようです。これは正常ですか?

はい、正常です。

グループ化も集計もされていないフィールドが返される順序に依存するべきではありません。

GROUP_CONCATORDER BYには、オプティマイザが考慮に入れる独自の句があり、レコードを解析する順序を変更できます。

とともに最初のレコードを返すには、次をGROUP_CONCAT使用します。

SELECT  m.*, gc
FROM    (
        SELECT  id, MIN(date) AS mindate, GROUP_CONCAT(tags) AS gc
        FROM    myview
        GROUP BY
                id
        ) md
JOIN    m.*
ON      m.id = md.id
        AND m.date = md.mindate
于 2011-03-25T12:48:14.527 に答える
5

GROUP_CONCAT を注文するのはどうですか?

SELECT value1, GROUP_CONCAT(value1 ORDER BY date DESC)   
FROM table1  
GROUP BY value1;

これは、前提が必要な構文です。

于 2011-10-18T17:15:17.000 に答える
1

これは、集計関数で使用されていないフィールドやグループ化に使用されていないフィールドに対して、正確な行が返されることを mysql が保証しないためです。

そして、明確にするために、「成熟した」rdbms(postgre、sqlサーバー、oracleなど)では、*を指定することを許可していませんGROUP BY(または集計のないフィールドまたはで指定されていないフィールドGROUP BY)-そしてそれは大きな「制限」です。

于 2011-03-25T12:46:05.920 に答える