สอบถาม SQL (อยาก LEFT JOIN 2 ฟิวด์กับ อีกตารางหนึ่ง พร้อมๆกัน)

เริ่มโดย banban, 06 พฤศจิกายน 2008, 12:40:58

หัวข้อก่อนหน้า - หัวข้อถัดไป

0 สมาชิก และ 1 ผู้มาเยือน กำลังดูหัวข้อนี้

banban

คำถามอาจมีประโยชน์กับใครหลายคนนะครับ โดยเฉพาะคนที่อยากสร้างเวบไซท์ Community ที่กดขอพบเพื่อนได้

ถ้าหากมี

1. ตาราง member คือ ข้อมูลสมาชิก
2. ตาราง member_add คือ ข้อมูลว่า ใครขอเป็นเพื่อนกับใคร ซึ่งมีฟิวสำคัญ 2 ฟิว คือ
    - ma_mem_id = id ของคนที่ถูกขอเป็นเพื่อน
    - ma_mem_id_addby = id ของคนที่เป็นผู้ขอ


ผมติดปัญหานิดเดียวเท่านั้น คือ จะ SELECT อย่างไร ให้แสดงข้อมูล สมาชิกคนหนึ่งๆมีใครเป็นเพื่อนบ้าง เพราะ สมาชิกคนหนึ่งๆ มีสถานะ 2 แบบ คือ เป็นผู้ขอเป็นเพื่อนกับคนอื่น และ เป็นผู้ถูกขอ นั่นคือ id=5 (สมมุติ) จะมีได้ทั้ง 2 ฟิว คือ ma_mem_id และ ma_mem_id_addby

จากการ SQL ที่ยังผิดอยู่ คือ

select ma.*, m.* from member_add ma LEFT JOIN member m ON ( ma.ma_mem_id_addby=m.id ) where ( ( ma.ma_mem_id='5' or ma.ma_mem_id_addby='5' ) ) GROUP BY ma.ma_add_day DESC

ซึ่งมันจะแสดงผลผิด เพราะ ON ( ma.ma_mem_id_addby=m.id ) มันคือเชื่อมตารางเฉพาะที่ id=5 เป็นคน ขอพบเพื่อนเท่านั้น ไม่ได้เอา เพื่อนที่ขอพบ id=5 มาแสดงด้วย?


คิดว่าคงต้องใช้เงื่อนไขอะไรบางอย่าง ให้แสดงข้อมูลทั้ง 2 สถานะ (ให้สามารถ LEFT JOIN ได้ทั้ง ma_mem_id และ ma_mem_id_addby)


ใครพอจะทราบวิธีบ้างครับ? ขอขอบคุณอย่างสูง

siamjung

จริงๆแล้ว table รองที่เก็บข้อมูลว่าใคร add หรือถูก add ควรจะทำ field id ของสมาชิกนั้นๆเป็นหลักเอาไว้ด้วยหนะครับ แล้วตอน select ข้อมูลค่อยเทียบค่าจาก id หลักที่ตรงกับ table สมาชิกเอา แล้วจะเขียนค่าได้ง่ายๆลักษณะนี้

select * from member m LEFT JOIN member_add ma
ON m.id=ma.id where ma.ma_mem_id='5' or ma.ma_mem_id_addby='5' ;

ลองดูครับ
งดรับงาน custom coding เตรียมพบบริการใหม่เร็วๆนี้

รับทำ PHP หรือปรับระบบระดับ bigbig เน้น cache คนเข้าแบบกระฉูดๆ <- สมัยก่อน

KendoUI,Ajax,Json,Custom Framework,JqueryUI,Adodb,Memcache,Smarty <- สมัยก่อน

[direct=https://www.youtube.com/watch?v=2LxLC93Q1rA]Indicator สัญญาณเทรดคมๆ[/direct]

[direct=https://play.google.com/store/apps/details?id=com.itwetrade.basictrade]App เรียนเทรดพื้นฐาน[/direct]

EThaiZone

ลองแบบนี้ยังครับ ไม่แน่ใจว่าได้ไหม

ON ( ma.ma_mem_id_addby=m.id OR ma.ma_mem_id=m.id)

ไม่งั้นก็ลอง join ต่อกันสองตัวดูครับ

payu

ทำได้หลายแบบแล้วแต่จุดประสงค์และวิธีนำไปใช้ครับ ...


select ma.*, m1.*, m2.*
from member_add ma
left join member m1 on m1.id=ma.ma_mem_id_addby
left join member m2 on m2.id=ma.ma_mem_id
where
ma.ma_mem_id = '5' or
ma.ma_mem_id_addby = '5'


อันนี้มาในแบบ m1.* และ m2.* โดย
m1.* คือ ข้อมูลของคนที่ขอ (กรณีที่ '5' คือคนที่ถูกขอเป็นเพื่อน)
m2.* คือ ข้อมูลของคนที่ถูกขอ (กรณีที่ '5' คือคนที่ขอเป็นเพื่อน)



select ma.*, m.*
from member_add ma
left join member m on ma.ma_mem_id_addby=m.id
where
ma.ma_mem_id = '5'

union

select ma.*, m.*
from member_add ma
left join member m on ma.ma_mem_id=m.id
where
ma.ma_mem_id_addby = '5'


ส่วนแบบนี้ m.* จะรวมมาหมดเลย .. เป็นเพื่อนของ '5' (ทั้งกรณีขอ '5' เป็นเพื่อน และ '5' มาขอเป็นเพื่อน)

[direct=http://www.facebook.com/iipayu]payu on facebook[/direct]

EThaiZone

ูู^
^
นี้คนหรือบอทครับ เห็นออนทั้งวัน  :D (แซวขำๆ นะครับ)

payu

^
^
^
คุณโจ้ .. มาแอบตามดูผมหรอ .. อิอิ (ส่วนใหญ่เป็นบอท ตอนนี้เป็นคน)


[direct=http://www.facebook.com/iipayu]payu on facebook[/direct]

banban

ขอบคุณทุกๆคนมากนะครับ ตอนนี้ทำได้แล้ว มี 2 แนว คือ แบบ select ธรรมดา แต่ใส่ where เยอะๆ กับอีกแบบ คือ UNION

แบบธรรมดา คือ Select ครั้งเดียวโดยเลือกมาทั้ง 2 แบบ แล้วคัดออกด้วย where เยอะหน่อย ใช้เวลา 0.0004 วินาที
select ma.*, m.* from member_add ma, member m where ( ( ma.ma_mem_id='14' or ma.ma_mem_id_addby='14' ) and ( m.id != '14' ) AND ( ma.ma_mem_id=m.id OR ma.ma_mem_id_addby=m.id ) )


แบบ UNION เป็นการ select 2 ครั้ง แล้วเอาผลลัพท์มารวมกัน ใช้เวลา  0.0004 วินาที
( select ma.*, m.* from member_add ma LEFT JOIN member m ON ( ma.ma_mem_id=m.id ) where ( ma.ma_mem_id_addby='14' ) ) UNION ( select ma.*, m.* from member_add ma LEFT JOIN member m ON ( ma.ma_mem_id_addby=m.id ) where ( ma.ma_mem_id='14' ) )


ตอนนี้ เป็นแค่การเขียนโปรแกรม ยังมีข้อมูลในตาราง member แค่ 4-5 รายการ เลยใช้เวลาเท่ากันเลย

แต่ถ้าข้อมูลมากขึ้นๆ หลายๆหมื่นรายการ ทุกท่านคิดว่า วิธีไหน จะใช้ process SQL น้อยกว่ากันครับ?  ::)

EThaiZone

เคยมีบล็อกหนึ่ง จำไม่ได้แล้วว่าของใคร

แต่ว่าเขาบอกไว้ ว่าถ้าเยอะๆ หรือคนเข้ามากๆ
สุดท้าย แบบไม่ต้อง join ไม่ต้องอะไร จะดีสุด

เพราะ mysql ไว้เก็บข้อมูล ไม่ได้ไว้ใช้จัดสรร หรือให้มันคิดอะ

อ้างถึงจาก: banban ใน 06 พฤศจิกายน 2008, 22:27:39
แต่ถ้าข้อมูลมากขึ้นๆ หลายๆหมื่นรายการ ทุกท่านคิดว่า วิธีไหน จะใช้ process SQL น้อยกว่ากันครับ?  ::)

ก็ทดลองดูสิครับ (ตอบแบบกำปั้นทุบดิน  :D) เพราะแค่เขียน loop สั่ง insert ข้อมูลทดลอง
ก็ทดสอบได้แล้วอะ