0

GROUP BY 句を追加するとクエリの結果が変わる理由を説明してください。他のすべては同じままで、GROUP BY 句を削除すると、GROUP BY 句を追加した場合とは異なる結果が生成されます。

GROUP BY は、カウントを変更するのではなく、単にフィールドごとに結果をグループ化するように思えます。

データを table2.name で整理し、それぞれの数を取得する必要があります

SELECT table2.name, COUNT(DISTINCT(op.id))
FROM op INNER JOIN table1 ON table1.EID = op.ID
    INNER JOIN table3 ON table3.id = table1.jobid
    INNER JOIN table2 ON table2.id = table3.CatID
WHERE op.ActiveStartDate <= NOW()
    AND op.ActiveEndDate >= NOW()
GROUP BY table2.name
ORDER BY COUNT(*) DESC;
4

2 に答える 2

0

これは、すべての GROUP BY アクションが ORDER BY アクションの前に適用されるためです。ただし、上記の場合、ORDER 句にグループ化関数があります。これは、結果のデータ セットの ORDER BY の前に、実際には 3 つのグループ化が適用されていることを意味します。

  • COUNT(DISTINCT(op.id))
  • GROUP BY table2.name
  • カウント(*)

悲しいことに、MySQL の内部の仕組みについて、これが正確な効果をもたらす理由を知るには十分ではありませんが、それを修正する方法は知っています。

解決策はサブSELECTです。

SELECT *
FROM (
    SELECT
        table2.name,
        COUNT(DISTINCT(op.id)),
        COUNT(*) as c
    FROM op 
        JOIN table1 ON table1.EID = op.ID
        JOIN table3 ON table3.id = table1.jobid
        JOIN table2 ON table2.id = table3.CatID
    WHERE
        op.ActiveStartDate <= NOW()
        AND op.ActiveEndDate >= NOW()
    GROUP BY
        table2.name
) AS t
ORDER BY
    t.c DESC

うまくいけば、これでクエリが遅くなりすぎないでしょう!

于 2014-09-01T16:16:43.900 に答える