0

私はこれと同様の解決策に対応しようとしています-私が持っているのはJOIN内のSELECTクエリであり、問​​題はクエリがすべての行に対して完全に実行されることです(私はテーブルごとに60,000行を話しています-そしてそれは実行されます3 つのテーブルで!)。

私がやりたいことは、JOIN 内の SELECT に WHERE 句を追加することです。しかし、外側の SELECT にアクセスできず、必要な適切な WHERE 条件を取得できません。私が試みているクエリは次のとおりです。

SELECT  c.compete_id AS id,
      s.id AS store_id,
      c.enabled AS enabled,
      s.store_name AS store_name,
      s.store_url AS store_url,
      c.verified AS verified,
      r.rating_total AS rating,
      r.positive_percent AS percent,
      r.type AS type
FROM compete_settings c
LEFT JOIN stores s
    ON c.compete_id = s.id
LEFT JOIN (
    (SELECT store_id, rating_total, positive_percent, 'ebay' AS type FROM ebay_sellers WHERE store_id = c.compete_id)
    UNION
    (SELECT store_id, rating_total, positive_percent, 'amazon' AS type FROM amazon_sellers WHERE store_id = c.compete_id)
    UNION
    (SELECT store_id, CASE WHEN rank = 0 THEN NULL ELSE (200000 - rank) END AS rating_total, '100' as positive_percent, 'alexa' AS type FROM alexa_ratings WHERE store_id = c.compete_id)
) AS r
ON c.compete_id = r.store_id
    WHERE c.store_id = :store_id

はフレームワークを介してバインドされた変数であることに注意してください:store_id- それが number であると想像してみましょう12345

これどうやってするの?何か案は?

4

1 に答える 1

0

最終的には別のアプローチを採用しました。すべてを JOIN し、CASE を使用して適切な列のみを選択しました。最後のクエリは次のとおりです。

SELECT  c.id AS id,
      s.id AS store_id,
      c.enabled AS enabled,
      s.store_name AS store_name,
      s.store_url AS store_url,
      c.verified AS verified,
      (CASE WHEN eb.rating_total IS NOT NULL THEN eb.rating_total
            WHEN am.rating_total IS NOT NULL THEN am.rating_total
            WHEN ax.rank IS NOT NULL THEN ax.rank
      END) AS rating,
      (CASE WHEN eb.positive_percent IS NOT NULL THEN eb.positive_percent
            WHEN am.positive_percent IS NOT NULL THEN am.positive_percent
            WHEN ax.rank IS NOT NULL THEN '100'
      END) AS percent,
      (CASE WHEN eb.positive_percent IS NOT NULL THEN 'ebay'
            WHEN am.positive_percent IS NOT NULL THEN 'amazon'
            WHEN ax.rank IS NOT NULL THEN 'alexa'
      END) AS type
FROM compete_settings c
LEFT JOIN stores s
  ON c.compete_id = s.id
LEFT JOIN ebay_sellers eb ON c.compete_id = eb.store_id
LEFT JOIN amazon_sellers am ON c.compete_id = am.store_id
LEFT JOIN alexa_ratings ax ON c.compete_id = ax.store_id
WHERE c.store_id = :store_id
于 2013-07-11T07:42:24.297 に答える