簡體   English   中英

獲取子查詢,其中子句ID與主查詢的ID匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM