0

質問が十分に明確であることを願っています。

これが私の質問です:

SELECT
    'Total Complete' AS name, count(c.id) AS amnt
FROM
    lanes AS c
      LEFT JOIN leads AS l
        ON ((c.carrier_mcn = l.authority_number
              AND l.authority_type = 'mc')
          OR c.carrier_mcn = l.mcn
          OR c.carrier_mcn = CONCAT('MC', l.authority_number))
          AND c.carrier_mcn <> 0
  LEFT JOIN lanes_emails AS cem1
    ON cem1.cid = c.id AND cem1.deleted = 0
  LEFT JOIN lanes_emails AS cem2
    ON cem1.cid = cem2.cid AND cem2.deleted = 0 AND cem2.id < cem1.id
  LEFT JOIN lanes_equipment AS ceq1
    ON ceq1.cid = c.id AND ceq1.deleted = 0
  LEFT JOIN lanes_equipment AS ceq2
    ON ceq1.cid = ceq2.cid AND ceq1.deleted = 0 AND ceq2.id < ceq1.id
  LEFT JOIN lanes_service_area AS csa1
    ON csa1.cid = c.id AND AND flag = 2 csa1.deleted = 0
  LEFT JOIN lanes_service_area AS csa2
    ON csa1.cid = csa2.cid AND AND flag = 2 csa1.deleted = 0 AND csa2.id < csa1.id
WHERE
    c.carrier_mcn IS NOT NULL and c.carrier_mcn <> ''
    AND c.broker_mcn IS NOT NULL and c.broker_mcn <> ''
    AND c.fax IS NOT NULL and c.fax <> ''
    AND cem2.id IS NOT NULL
    AND ceq2.id IS NOT NULL
    AND csa2.id IS NOT NULL

ここで私がやろうとしているのは、少なくとも1つの電子メール、機器、サービスエリア、MC番号、またはFAX番号がある「レーン」から行の総数を取得することです。MC番号は2つありますが、どちらも同じテーブルにあります。主な問題は、無制限の電子メール、機器、およびサービスエリアが存在する可能性があることです。

この場合、私はこの問題についての記事を書き始め、別の同様の問題を発見しました:

MySQL:左結合を実行して、結合テーブルから1行だけをプルできますか?

そこで、試してクエリに実装しました。残念ながら、それは私が計画したようには機能しませんでした。

複数の行があれば問題なく動作します。私が複数の電子メールを持っていたという事実を無視して、それは正しいカウントを取得しますが、1つしかない場合は機能しません。代わりに、結果は返されませんでした。

いいえ、GROUPBYを使用して必要な結果を取得することはできません。GROUP BYを試しましたが、完全な結果リストを返すときに使用するのが大好きですが、カウントを返そうとすると、GROUPBYが繰り返し混乱します。

サブクエリを使用せずにmysqlの結合で1行だけを返すように強制する方法はありますか?これらの他のテーブルのいずれかから1つのアイテムがあるかどうかを知る必要があるだけで、すべてを返す必要はありません。また、WHERE句を介して機能するようにプログラムする方法もわかりません。

棒グラフにはこのクエリが必要です。私は実際にこれらのクエリのいくつかを持っています。これはすべての結果を必要とするものですが、要件のない他のもの、少なくとも1つの電子メール、少なくとも1つのmc番号などがありますが、これを機能させることができれば、残りを機能させることができます。

4

1 に答える 1

2

exists次の句を使用できます。

where   exists 
        (
        select  *
        from    lanes_emails AS cem1
        where   cem1.cid = c.id 
                and cem1.deleted = 0
        )
        and exists
        ...
于 2012-08-11T07:32:12.587 に答える