1

私は Mysql 5.1 を使用しており、このクエリを使用しています。サブクエリを使用せずに同じ結果を達成する方法はありますか?

SELECT oref.affiliate_id, ROUND(sum( oph.amount ) * 0.10 ,2) AS tsum
FROM operators_referer AS oref 
LEFT JOIN operators_payments_history AS oph 
ON oref.operator_id = oph.operator_id
WHERE oref.affiliate_id = 28221
AND
(
    oph.date_paid > 
    (
        SELECT MAX(aph.date_paid) 
        FROM affiliates_payments_history AS aph 
        WHERE aph.operator_id = oref.affiliate_id
    )
    OR 
    (
        SELECT MAX(aph.date_paid)
        FROM affiliates_payments_history AS aph 
        WHERE aph.operator_id = oref.affiliate_id 
    ) 
    is NULL
)
4

5 に答える 5

3

ドント・ドゥ・イット! テーブルが適切にインデックス化されていて、データベース構造が理にかなっている場合は、これをサブクエリに任せた方がほぼ確実です。あなたのコメントによると、これは物事を簡素化し、スピードアップするように思えますが、必ずしもそうとは限りません。パーサーは、非サブクエリ フォームで必ずしもより良い仕事をするわけではありません。サブクエリの明快さ、およびサブクエリを使用しないように書き直されたクエリの複雑さは、これが価値のある目標ではないことを示しています。

それができるかどうかを知る必要がありますか?このCS.stackexchangeの質問 への回答はその方法を示しており、結合ベースのクエリとして記述できないサブクエリを持つ方法はなく、set-differencesの可能性がないことを指摘する人もいます。つまり、単純化する方法があり、そのためのアルゴリズム的な方法へのリンクがいくつかリンクされています。

于 2012-06-25T15:33:02.247 に答える
2

HAVING句を試しましたか?

SELECT oref.affiliate_id, ROUND(sum( oph.amount ) * 0.10 ,2) AS tsum
FROM operators_referer AS oref 
LEFT JOIN operators_payments_history AS oph 
ON oref.operator_id = oph.operator_id
LEFT JOIN affiliates_payments_history AS aph
ON aph.operator_id = oref.affiliate_id
WHERE oref.affiliate_id = 28221
GROUP BY oref.affiliate_id
HAVING MAX(aph.date_paid) > oph.date_paid OR MAX(aph.date_paid) IS NULL
于 2012-06-25T14:49:18.360 に答える
1

これを試して::

  SELECT oref.affiliate_id, ROUND(sum( oph.amount ) * 0.10 ,2) AS tsum
    FROM operators_referer AS oref 
    LEFT JOIN operators_payments_history AS oph 
    ON oref.operator_id = oph.operator_id
   LEFT JOIN affiliates_payments_history AS aph ON aph.operator_id = oref.affiliate_id
    WHERE oref.affiliate_id = 28221
  GROUP BY oref.affiliate_id
  HAVING IFNULL(MAX(aph.date_paid),0 > oph.date_paid)
于 2012-06-25T14:45:24.873 に答える
1
SELECT MAX(aph.date_paid) AS max_aph, 
       oref.affiliate_id, 
       ROUND(sum( oph.amount ) * 0.10 ,2) AS tsum
FROM operators_referer AS oref 
LEFT JOIN operators_payments_history AS oph 
       ON oref.operator_id = oph.operator_id
LEFT JOIN affiliates_payments_history AS aph 
       ON aph.operator_id = oref.affiliate_id
WHERE oref.affiliate_id = 28221
AND (oph.date_paid > max_aph OR max_aph is NULL)

試していませんが、これがあなたが探しているものだと思います。

于 2012-06-25T14:48:41.057 に答える
1

あなたが探しているのは単純なJOINロジックです。

そのようです:

SELECT oref.affiliate_id, ROUND(sum( oph.amount ) * 0.10 ,2) AS tsum
FROM operators_referer AS oref 
     LEFT JOIN operators_payments_history AS oph 
            ON oref.operator_id = oph.operator_id
     LEFT JOIN affiliates_payments_history AS aph
            ON aph.operator_id = oref.affiliate_id
WHERE oref.affiliate_id = 28221
AND ( oph.date_paid > MAX(aph.date_paid)
OR MAX(aph.date_paid) IS NULL)    
GROUP BY oref.affiliate_id;

クエリが意味することは、基本的に「aph テーブルと oph テーブルを oref に結合し、oref.affiliate_id のスコープ内でのみ max 関数を適用し、条件が適用される行を探す」ということです。

JOINとの機能についてはLEFT JOIN、MySQL のマニュアルを参照してください。

于 2012-06-25T14:52:41.540 に答える