0

これが私のクエリです

SELECT 
    COALESCE(js.name,'Lead saknas'),
    count(j.id)
FROM 
    jobs j
LEFT JOIN
    job_sources js
    ON j.job_source=js.id
LEFT JOIN 
    (SELECT 
        * 
    FROM 
        quotes 
    GROUP BY 
        job_id) q 
    ON j.id=q.job_id
GROUP BY
    j.job_source

問題は、各ジョブが複数の見積もりを持つことが許可されていることです。そのため、引用符を job_id でグループ化します。確かに、これは機能します。しかし、サブクエリを使用したソリューションは好きではありません。グループ句をサブクエリからメインクエリに分割するにはどうすればよいですか? q.job_id を既存の句の前後にメイン グループ句に追加しようとしましたが、同じ結果が得られません。

4

2 に答える 2

0

あなたは単純なものを探しているgroup byと思います:

SELECT COALESCE(js.name,'Lead saknas'), count(j.id)
FROM jobs j LEFT JOIN
     job_sources js
     ON j.job_source=js.id
GROUP BY COALESCE(js.name,'Lead saknas')
于 2012-11-21T15:24:52.207 に答える
0

サブクエリの GROUP BY は、特定の job_id に対して引用符からのすべての結果を 1 に制限します (MySQL は、'SELECT *' を実行した場合、そのグループ化を持つ行が複数ある場合でも、個別のグループ化ごとに 1 つの結果のみを返します)。各job_idの引用符から1行のみを持つ表のjob_sourcesにジョブを結合しています。

GROUP BY がメイン クエリにある場合、3 つのテーブルが結合され、job_id ごとに 1 つが選択されます。

MySQL は複数の行のうち任意の行を返すことができるため、すべての場合で結果が同じになるとは期待できません。

グループ関数を使用する場合は、同じ結果が返されるはずです (SELECT COUNT(*)、GROUP_CONCAT(quote_id) FROM quotes などを試してください)。

MS SQL では、GROUP BY を実行するときに「SELECT *」を実行することはできません (すべてのフィールドを GROUP BY しない限り、これは無意味です)。クエリごとに異なる結果が返される可能性があるためです。MySQL でこれを行うことが許可されているということは、自分が何をしているのかを知っておく必要があるということです。

具体的には、MS SQL では、グループ化関数を使用しない限り、グループ化していないフィールドを選択することはできません。

于 2012-11-21T11:19:03.573 に答える