2

ユーザーが検索バーに入力した用語に応じてデータを取得するクエリを以下に作成しています。今、私がやろうとしているのは重複データを表示しないことです。したがって、すべてのフィールドがまったく同じである行が 2 つある場合、それは重複行であるため、この行は複数回ではなく 1 回だけ表示されます。重複する行が表示されないので、これを行うように見えると思いますが、GROUP BY 句にグループ連結を含めることができないため、Answer フィールドを除くすべての SELECT フィールドで GROUP BY を実行するだけでした。

しかし、私の質問は、重複行を表示しないために GROUP Y 句のそのフィールドが必要なのか、それとも本当に必要ないのかということです。

SELECT
      q.QuestionContent, 
      o.OptionType, 
      q.NoofAnswers, 
      GROUP_CONCAT(DISTINCT Answer ORDER BY Answer SEPARATOR ',') AS Answer, 
      r.ReplyType, 
      q.QuestionMarks
    FROM Question q
    LEFT JOIN Answer an
      ON q.QuestionId = an.QuestionId
    LEFT JOIN Reply r 
      ON q.ReplyId = r.ReplyId 
    LEFT JOIN Option_Table o 
      ON q.OptionId = o.OptionId 
    WHERE ".implode(" AND ", array_fill(0, $numTerms, "q.QuestionContent LIKE ?"))."
    GROUP BY   q.QuestionContent, 
      o.OptionType, 
      q.NoofAnswers, 
      r.ReplyType, 
      q.QuestionMarks
    ORDER BY ".implode(", ", array_fill(0, $numTerms, "IF(q.QuestionContent LIKE ?, 1, 0) DESC"))."
4

2 に答える 2

1

group_concat()いいえ、のは必要ありませんselect。はgroup by、特定の値の組み合わせが の列に対して 1 回表示されるようにしますgroup by。これらは異なることが保証されているため、他の列について心配する必要はありません。

これgroup_concat()は、集計に基づく計算列です。group byステートメントにそのような列を含めることは許可されていません。それらを再度集計する場合は、サブクエリを使用する必要があります。

于 2013-02-05T19:02:00.193 に答える
1

私はDISTINCTより良い/より簡単になるかもしれないと思います:

SELECT
  DISTINCT q.QuestionContent, 
于 2013-02-05T18:59:43.607 に答える