从子查询获取子查询where子句id匹配id

时间:2014-12-29 17:05:00

标签: mysql sql subquery

我需要从结果集中每一行的当前列的列中获取一个值,所以我能想到的最好的事情就是这样的子查询:

SELECT ads.ad_id,
       ads.ad_status,
       ads.ad_impression_bid,
       ads.allocated_credits,
       ads.daily_credits,
       ads.used_credits,
       ads.ad_type_id,
       ads.aname,
       at.url,
       adst.text,
       Ifnull(Sum(views), 0)  AS impressions,
       Ifnull(Sum(clicks), 0) AS cliks,
       views,
       clicks,
       view_cost,
       click_cost
FROM   ads
       JOIN ad_targets at USING(ad_target_id)
       JOIN ad_status adst
         ON( adst.ad_status_id = ads.ad_status )
       LEFT JOIN daily_displays using(ad_id)
       LEFT JOIN (SELECT views,
                         clicks,
                         view_cost,
                         click_cost,
                         ad_id
                  FROM   daily_displays
                  WHERE  day = Curdate()
                         AND ad_id = ads.ad_id) AS dd using(ad_id)
WHERE  owner_id = 13035
       AND ads.ad_status <> 5
GROUP  BY ads.ad_id
ORDER  BY ads.ad_id ASC 

当我运行它时,我收到一个错误,说Unknown column 'ads.ad_id' in 'where clause'并且在子查询中,但当我发表评论时没有错误。有什么我可以做的,所以我可以访问它吗?

我希望子查询中的ads_id与主查询中的ads.ad_id匹配。

修改

我想要完成的是组合我们的代码。在PHP中,编写一个查询获取用户拥有的所有广告的列表,然后对每个广告运行2个查询。我希望将其结合起来,如果有人有20个广告,则不会进行41次查询。

首先,我们的代码运行此代码来获取广告列表:

$sql = "SELECT ads.ad_id, ads.ad_status, ads.ad_impression_bid, ads.allocated_credits, ads.daily_credits,
    ads.used_credits, ads.ad_type_id, ads.aname,
    at.url, adst.text
FROM ads
JOIN ad_targets at USING(ad_target_id)
JOIN ad_status adst ON(adst.ad_status_id = ads.ad_status)
WHERE owner_id=" . (int)$_SESSION['vp_member']['member_id'] . " and ads.ad_status <> 5 ORDER BY ads.ad_id ASC";

然后,对于每个广告,我们运行这两个查询以获取有关它们的信息:

$sql = "SELECT ifnull(SUM(views),0) AS impressions, ifnull(SUM(clicks),0) as cliks FROM daily_displays WHERE ad_id=" . (int)$this->ad_id;
// Run the query and return the data here

$sql = "SELECT views,clicks,view_cost, click_cost FROM daily_displays WHERE ad_id=" . (int)$this->ad_id . " AND day=CURDATE() ";
// Run the query and return the data again

我正在尝试将这3个查询合并为一个查询。

2 个答案:

答案 0 :(得分:1)

这里不需要子查询,请尝试代替

LEFT JOIN daily_displays using(ad_id)
       LEFT JOIN (SELECT views,
                         clicks,
                         view_cost,
                         click_cost,
                         ad_id
                  FROM   daily_displays
                  WHERE  day = Curdate()
                         AND ad_id = ads.ad_id) AS dd using(ad_id)

使用

LEFT JOIN daily_displays using(ad_id)
ON (daily_displays.day = Curdate() AND daily_displays.ad_id = ads.ad_id)

答案 1 :(得分:0)

我们能够通过在子查询中使用连接来解决这个问题。运行此操作大约需要0.109 seconds才能运行。

(
select dd2.views, dd2.clicks, dd2.view_cost, dd2.click_cost, dd2.ad_id from daily_displays dd2
join ads ads2 on(ads2.owner_id = 13035 and ads2.ad_id = dd2.ad_id)
where day = curdate()
) as dd using(ad_id)
相关问题