查看完整版本: SQL 語句求解
頁: [1]

u48326 發表於 2020-6-20 06:09 PM

SQL 語句求解

廣告欄張貼主檔 custom_data_1014,欄位有:
        data_id(主鍵)、application_date(申請日期)、postdate_begin(張貼日期)、postdate_end(截止日期)。
明細檔 custom_data_1014_ad_list,欄位有:
        data_id(外鍵)、ad_id(廣告欄編號)。
過帳檔 custom_data_1020,欄位有:
        Data_id(主鍵)、id(廣告欄編號)、postdate(張貼日期)、post_qty(張貼份數)
  此表已建立 id + 全年日曆、post_qty =0 的基本資料。

需求:
  從張貼主檔及明細檔,查找出當日申請者,將過帳檔對應的 id + postdate 的張貼數量加1。


SQL 語句:
UPDATE custom_data_1020 as e,
        (SELECT b.data_id, b.ad_id, a.postdate_begin, a.postdate_end
                from custom_data_1014_ad_list b
                        join custom_data_1014 a on a.data_id = b.data_id
                        WHERE b.data_id IN (SELECT data_id from custom_data_1014 where application_date = DATE_FORMAT(now(),"%Y-%m-%d"))
        ) as d
SET e.post_qty = e.post_qty + 1
WHERE e.id = d.ad_id and (postdate BETWEEN d.postdate_begin and d.postdate_end)


中間 select … as d 查詢結果如下:

data_id, ad_id ,postdate_begin, postdate_end
36, 01, 2020-06-26, 2020-08-07
36, 02, 2020-06-26, 2020-08-07
37, 01, 2020-06-26, 2020-07-03
37, 02, 2020-06-26, 2020-07-03
37, 03, 2020-06-26, 2020-07-03


問題:
例如以上查詢結果,id = 01,postdate = 6/26,累計應該為2。
執行結果Ad_id = 01 , postdate=6/26~8/7,post_qty皆為1。
AD_ID=02, postdate=6/26~8/7也是一樣的情況,累計只有1。

請教高手指點,以上 SQL 如何修正?

...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

danz0403 發表於 2020-6-23 12:14 PM

主要的邏輯應是:
UPDATE custom_data_1020 SET post_qty=post_qty + 1
WHERE id in (SELECT ... )

不過由於你的題目不是很清楚: 過帳檔對應的 id + postdate 的張貼數量加1
這個意思不是很清楚。
所以SELECT的部份還不知道應怎麼寫。

danz0403 發表於 2020-6-23 01:57 PM

再仔細看你的帖, 如果你要更新的過帳檔條件是: 1. 當天申請, 且 2.過帳檔的張貼日期必須在主檔的張貼期間; 那麼, SQL可以這樣寫:

UPDATE custom_data_1020 SET post_qty=post_qty + 1
WHERE id in
    (SELECT ad_id
     FROM custom_data_1014_ad_list a, custom_data_1014 b
     WHERE a.data_id = b.data_id AND (postdate BETWEEN b.postdate_begin AND b.postdate_end)
                        AND b.application_date = DATE_FORMAT(now(),"%Y-%m-%d"))

u48326 發表於 2020-7-8 05:55 PM

感謝回覆。
我是初學 MySQL ,覺得它的應用真是千變萬化.....真讓人頭疼!

u48326 發表於 2020-7-9 11:47 AM

danz0403 發表於 2020-6-23 01:57 PM static/image/common/back.gif
再仔細看你的帖, 如果你要更新的過帳檔條件是: 1. 當天申請, 且 2.過帳檔的張貼日期必須在主檔的張貼期間;  ...

感謝回覆。
第5行中,欄位 postdate 僅存在於 custom_data_1020 中。

最後完成的 SQL 語句如下:

update custom_data_1020 P,
(
        SELECT receipt_no, application_date, postdate_begin, postdate_end, ad_id, L.postdate, L.id, count(*) count
        from custom_data_1014 M
        join custom_data_1014_ad_list D on D.data_id=M.data_id
        join custom_data_1020 L on L.id=D.ad_id and L.postdate between M.postdate_begin and M.postdate_end
        where M.application_date=DATE_FORMAT(now(),"%Y-%m-%d")
        GROUP BY id, postdate
        order by id, postdate
) as N
set  P.post_qty=P.post_qty+N.count
where P.id = N.id and P.postdate = N.postdate...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div>
頁: [1]