iT邦幫忙

1

子查詢使用的問題

請教大家
當使用下列的語法
select pageid from content where contentid in (select contentid from content where contenttype='COMMENT' and creationdate between '2017/3/1' and '2017/4/1')
所查詢出來的pageid有下列6筆
57181233
49414303
47120909
47120909
49414303
49414303

但是當我在加上一個子查詢
select * from content where contentid in (select pageid from content where contentid in (select contentid from content where contenttype='COMMENT' and creationdate between '2017/3/1' and '2017/4/1'))

會變成只有3筆資料,是否可以一樣顯示6筆原來所要顯示的資料呢?謝謝

石頭 iT邦高手 1 級 ‧ 2017-04-04 13:57:24 檢舉
請問一下
第一句sql和第二句sql有差別嗎?
ektrontek iT邦研究生 1 級 ‧ 2017-04-04 15:24:16 檢舉
我有貼錯 ;主要是抓出所符合的日期區間及類型的contentid後,將其pageid來抓出,最後用contentid來與pageid比對出所要的資料
請列出 3/1 ~ 4/1 的欄位資料,這樣才能抓問題,沒有資料,是要我們隔空抓藥嗎?

2 個回答

0
HankJiang
iT邦新手 5 級 ‧ 2017-04-05 08:11:49

所以問題是為什麼六筆變三筆嗎?
可能的原因大概是你用contentid in pageid
假設pageid 撈出來1,2,3,4,5,6
但contentid跟pageid的資料對可能是(1,1)(1,2)(2,3)(2,4)(3,5)(3,6)之類的
那最後撈出來就只有三筆挺正常的

0
ctn7001
iT邦新手 4 級 ‧ 2017-04-05 15:10:02

sql 結構 跟 用contentid來與pageid比對出所要的資料(需求描述不明確) 2者意義不相符,
以下以Tab2 out JOIN TAB1 也不算真的的2個table 比對,
只是將tab2 6筆不管tab1有沒有都秀出來,tab1 有值就秀出來

SELECT TAB2.pageid, TAB1.contentid
FROM content TAB1,
             (SELECT pageid
                FROM content
                WHERE contentid IN (SELECT contentid
                FROM content
                WHERE     contenttype = 'COMMENT'
                AND creationdate BETWEEN '2017/3/1'
                AND '2017/4/1'))TAB2                                                                     
WHERE TAB2.pageid =  TAB1.contentid(+)

TAB2有6筆 OUT JOIN TAB1 對上 3筆, 6筆都會秀

看更多先前的回應...收起先前的回應...
ektrontek iT邦研究生 1 級 ‧ 2017-04-05 19:56:06 檢舉

感謝大家幫忙
目前我不太確定這些欄位的關聯性,僅把目前所知道的整理起來 (有些是推測出來的,但可參考性應該高)
http://ithelp.ithome.com.tw/upload/images/20170405/20003705gjUcy51HIU.jpg

ctn7001 iT邦新手 4 級 ‧ 2017-04-06 13:48:15 檢舉

架構很特別,
從contenttype 來看是很多類型都放一齊,
contenttype 'COMMENT'這類別 pageid 有值可能指是for page 使用,
但'COMMENT' 也有可能用於別的類別,
6筆裡的3筆是對應到page,另外3筆可能不是對應到page這一類,而是別類,
不過這資料架構感覺有種什麼都丟一籃,
無法推想另外3筆一定對應同個table裡的資料

ektrontek iT邦研究生 1 級 ‧ 2017-04-06 20:26:57 檢舉

請教前輩
使用ctn7001的方式可行,是否可以再與另外一個資料表join抓出資料呢?在content資料表中有個spaceid欄位,而我想與spaces資料表的spaceid欄位join後抓出這6筆所在的spacename,謝謝
http://ithelp.ithome.com.tw/upload/images/20170406/2000370551uwnwCSEN.jpg

simon0627 iT邦新手 2 級 ‧ 2017-04-07 09:36:08 檢舉
SELECT TAB2.pageid, TAB1.contentid ,TAB3 spacename
FROM content TAB1,
             (SELECT pageid
                FROM content
                WHERE contentid IN (SELECT contentid
                FROM content
                WHERE     contenttype = 'COMMENT'
                AND creationdate BETWEEN '2017/3/1'
                AND '2017/4/1'))TAB2,spaces TAB3                                                                     
WHERE TAB2.pageid =  TAB1.contentid(+) and 
TAB1.spaceid = TAB3.spaceid

感覺你首要先了解一下 index 抓來取key值可以加速你理解 自已的資料庫結構

我要發表回答

立即登入回答