ลองแบบนี้ดูนะครับ สำหรับฟิลด์อื่นจะทำคล้ายๆกันครับ เพิ่มไปเรื่อยๆ แต่มันจะยิ่งช้าครับ
โค๊ด:
select distinct domain,
ifnull(
(select concat(pr,'->',l1.pr) from Lab l2 where l1.domain=l2.domain and chk=4),
'New') 'PRstatus',
ifnull(
(select concat(keyword,'->',l1.keyword) from Lab where l1.domain=domain and chk=4),
'New') 'KWstatus'
from Lab l1
where chk=5
union
select distinct domain,
'Deleted'
from Lab l1
where chk=4 and (select count(*) from Lab where domain=l1.domain and chk=5)=0
;
วิธีด้านบนยิ่งเพิ่มจำนวนฟิลด์จะยิ่งช้าครับ ลองอันนี้ดูนะครับว่าผลลัพธ์ได้คล้ายที่ต้องการหรือเปล่า เพราะมันจะเร็วกว่านะครับ
โค๊ด:
select distinct domain,
concat(pr,'->',l1.pr) 'PRstatus',
concat(keyword,'->',l1.keyword) 'KWstatus'
from Lab l1 inner join Lab l2 on l1.domain=l2.domain
union
select distinct domain,
'Deleted',''
from Lab l1
where chk=4 and (select count(*) from Lab where domain=l1.domain and chk=5)=0
select distinct domain,'',
'New'
from Lab l1
where chk=4 and (select count(*) from Lab where domain=l1.domain and chk=4)=0
;
ลองดูก่อนนะครับว่าได้มั้ย ถ้าได้แล้วจะจบให้ด้วยวิธีทำให้ select count(*) สุดท้ายเหลืออันเดียวครับ ซึ่งจะเร็วขึ้นเยอะครับ (แต่ขอไปลองดูก่อนเพราะปกติทำแต่ใน MS SQL Server น่ะครับ)
ผมว่าถ้าข้อมูลมันเยอะๆล่ะก็น่าจะทำในแนวกึ่งๆ data warehouse ดีมั้ยครับ? คือเมื่อมีการ update โดเมน A เกิดขึ้น ก็ให้ไปอัปเดทตัวเลขหรือการเปลี่ยนแปลงต่างๆใน table ที่เอาไว้เก็บผลลัพธ์โดยเฉพาะน่ะครับ จะได้...
- ไม่ต้องเสียเวลา query จากข้อมูลเยอะๆ เพราะช้าแน่นอน
- ไม่ต้องกังวลเรื่อง index เพราะถ้าสร้าง index เอาไว้เยอะๆเพื่อเวลา query จะได้เร็วๆ เวลาเพิ่ม/แก้ไขข้อมูลก็จะช้ากลับกันอีกครับ
ลองดูความเห็นของท่านอื่นด้วยนะครับ
ขอบคุณครับ
ขอบคุณครับ