1

多くのテーブルがあり、大きなクエリを実行しています(約5〜7個の左結合)。このように見えます

SELECT *, t.id
GROUP_CONCAT(field SEPARATOR '|') AS fields,
GROUP_CONCAT(other SEPARATOR '|') AS others
FROM table t
LEFT JOIN tablefields tf ON t.id = tf.user_id
LEFT JOIN tableothers to ON t.id = to.user_id
GROUP BY t.id

ここに問題があります。すべてのフィールドが適切に連結されていますが、結合されたテーブルの行が1つしかない場合でも、2つは「value | value | value | value」(15〜17回)のようになります。

私は何を間違えますか?

PS

1つのフィールドがsection_idで、他のフィールドがnoteであるため、DISTINCTを使用できません。注意は似ているかもしれませんが、section_idは一意です。

PPS

https://gist.github.com/3098105

クエリ結果の一部を見てください。

mysql> SELECT * FROM tablename;
+----+---------+------------+-----------+
| id | user_id | section_id | note_data |
+----+---------+------------+-----------+
|  1 |    1331 | UserVideo  | test      |
|  2 |    1331 | UserNCAA   | test      |
+----+---------+------------+-----------+
2 rows in set (0.00 sec)
4

2 に答える 2

5

と の両方に複数の一致する行がtablefieldsあるtableothers場合、行の外積が得られます。(これは、マーカス・アダムスが彼のコメントで得ていたことだと思います。)

「重複」を生成せずに、これらの各テーブルから「リスト」が必要な場合は、次のようにしてみてください。

SELECT tt.id
     , tt.fields
     , GROUP_CONCAT(to.other ORDER BY to.other SEPARATOR '|') AS `others`
  FROM (SELECT t.id
             , GROUP_CONCAT(tf.field ORDER BY tf.field SEPARATOR '|') AS `fields`
          FROM table t
          LEFT JOIN tablefields `tf` ON t.id = tf.user_id
         GROUP BY t.id
       ) tt
  LEFT JOIN tableothers `to` ON tt.id = to.user_id
 GROUP BY tt.id, tt.fields

としてエイリアスされたそのインライン ビューは、各 の 1 つの行で、ttからリストを取得します。その結果セットをテーブルに結合して、そのテーブルからリストを取得できます。この方法で結果セットを生成すると、各テーブルに一致する行が複数ある場合に余分な重複が生成されるのを回避できます。tablefieldst.idtableothers


DISTINCT保持したい各リストに重複する値があるため、キーワードを使用できないことに注意してください。それが要件ではなく、重複する値を削除できる場合は、DISTINCTキーワードを使用してほぼ同じ結果を得ることができます。

SELECT t.id
     , GROUP_CONCAT(DISTINCT tf.field ORDER BY tf.field SEPARATOR '|') AS `fields`
     , GROUP_CONCAT(DISTINCT to.other ORDER BY to.other SEPARATOR '|') AS `others`
  FROM table t
  LEFT JOIN tablefields `tf` ON t.id = tf.user_id
  LEFT JOIN tableothers `to` ON t.id = to.user_id
 GROUP BY t.id

このアプローチでは、外積を生成できますが、「外積」操作によって生成された重複値とネイティブ データに存在する重複値の両方の重複をすべて排除します。

于 2012-07-12T14:39:12.340 に答える
-2

t.*のせいです。グループ化を適用する列のみを選択する必要があります。何かのようなもの

SELECT t.id, 
GROUP_CONCAT(field SEPARATOR '|') AS fields, 
GROUP_CONCAT(other SEPARATOR '|') AS others 
FROM table t 
LEFT JOIN tablefields tf ON t.id = tf.user_id 
LEFT JOIN tableothers to ON t.id = to.user_id 
GROUP BY t1.id
于 2012-07-12T13:09:04.527 に答える