我需要从结果集中每一行的当前列的列中获取一个值,所以我能想到的最好的事情就是这样的子查询:
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个查询合并为一个查询。
答案 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)