where子句里面连接选择

时间:2013-07-10 16:25:10

标签: mysql sql

我正在尝试为this one提供类似的解决方案 - 我所拥有的是JOIN中的SELECT查询,问题是所有行的查询都运行完全(我说的是60,000行每个表 - 它在3个表上运行!)。

所以我想做的是在JOIN里面的SELECTs中添加一个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是通过框架绑定的变量 - 让我们想象它是数字12345

我该怎么做?有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我们最终采用了不同的方法 - 我们只是加入了所有内容,只选择了带有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