ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น

ThaiSEOBoard.comพัฒนาเว็บไซต์Programmingสอบถาม SQL (อยาก LEFT JOIN 2 ฟิวด์กับ อีกตารางหนึ่ง พร้อมๆกัน)
หน้า: [1]   ลงล่าง
พิมพ์
ผู้เขียน หัวข้อ: สอบถาม SQL (อยาก LEFT JOIN 2 ฟิวด์กับ อีกตารางหนึ่ง พร้อมๆกัน)  (อ่าน 5955 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
banban
สมุนแก๊งเสียว
*

พลังน้ำใจ: 37
ออฟไลน์ ออฟไลน์

กระทู้: 551



ดูรายละเอียด
« เมื่อ: 06 พฤศจิกายน 2008, 12:40:58 »

คำถามอาจมีประโยชน์กับใครหลายคนนะครับ โดยเฉพาะคนที่อยากสร้างเวบไซท์ 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
Verified Seller
ก๊วนเสียว
*

พลังน้ำใจ: 25
ออฟไลน์ ออฟไลน์

กระทู้: 419



ดูรายละเอียด เว็บไซต์
« ตอบ #1 เมื่อ: 06 พฤศจิกายน 2008, 14:09:27 »

จริงๆแล้ว 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 <- สมัยก่อน

Indicator สัญญาณเทรดคมๆ

App เรียนเทรดพื้นฐาน
EThaiZone
เจ้าพ่อโลลิค่อน
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 321
ออฟไลน์ ออฟไลน์

กระทู้: 12,518



ดูรายละเอียด เว็บไซต์
« ตอบ #2 เมื่อ: 06 พฤศจิกายน 2008, 14:50:59 »

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

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

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

payu
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 125
ออฟไลน์ ออฟไลน์

กระทู้: 1,887



ดูรายละเอียด
« ตอบ #3 เมื่อ: 06 พฤศจิกายน 2008, 14:53:50 »

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

โค๊ด:
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' มาขอเป็นเพื่อน)

บันทึกการเข้า

EThaiZone
เจ้าพ่อโลลิค่อน
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 321
ออฟไลน์ ออฟไลน์

กระทู้: 12,518



ดูรายละเอียด เว็บไซต์
« ตอบ #4 เมื่อ: 06 พฤศจิกายน 2008, 14:56:21 »

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

payu
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 125
ออฟไลน์ ออฟไลน์

กระทู้: 1,887



ดูรายละเอียด
« ตอบ #5 เมื่อ: 06 พฤศจิกายน 2008, 15:02:38 »

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


บันทึกการเข้า

banban
สมุนแก๊งเสียว
*

พลังน้ำใจ: 37
ออฟไลน์ ออฟไลน์

กระทู้: 551



ดูรายละเอียด
« ตอบ #6 เมื่อ: 06 พฤศจิกายน 2008, 22:27:39 »

ขอบคุณทุกๆคนมากนะครับ ตอนนี้ทำได้แล้ว มี 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 น้อยกว่ากันครับ?  :Smiley
« แก้ไขครั้งสุดท้าย: 06 พฤศจิกายน 2008, 22:41:12 โดย banban » บันทึกการเข้า
EThaiZone
เจ้าพ่อโลลิค่อน
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 321
ออฟไลน์ ออฟไลน์

กระทู้: 12,518



ดูรายละเอียด เว็บไซต์
« ตอบ #7 เมื่อ: 07 พฤศจิกายน 2008, 01:24:02 »

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

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

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

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

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

หน้า: [1]   ขึ้นบน
พิมพ์