![](/img/trans.png)
[英]Do I need to repeat the WHERE clause in a 'IN (SELECT MAX(id)' subquery?
[英]Get subquery where clause id match id from main query
我需要為結果集中的每一行從當日的列中獲取一個值,所以我能想到的最好的事情是對這樣的子查詢:
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個查詢合並為一個查詢。
您不需要此處的子查詢,請嘗試代替
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)
我們能夠通過在子查詢中使用聯接來解決此問題。 運行此程序大約需要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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.