ช่วยเรียบเรียง เงื่อนไขการใช้คำสั่ง select หน่อยครับ
select * from tb_member tm inner join tb_register tr on tb.member_id = tr.member_id
where tr.id_act != '1'
มั้ง ไม่รู้ว่า tb_register มีอะไรบ้าง
Date :
2009-11-28 01:02:06
By :
mr.v
tb_register จะมี
id_reg = คีย์หลักการลงทะเบียน
id_member = ไอดีสมาชิกที่ลงทะเบียน
id_act = ไอดีกิจกรรมที่ลงทะเบียน
ประมาณนี้ครับ
Code (PHP)
SELECT *
FROM tb_member tm
INNER JOIN tb_register tr ON tm.id_member = tr.id_member
WHERE tr.id_act != '1'
ผลลัพท์ที่ได้คือ จะแสดงผู้ที่ลงทะเบียนกิจกรรมทั้งหมด และกิจกรรมนั้นต้องไม่มีไอดีเท่ากับ1
ที่ผมต้องการ คือ แสดงรายชื่อผู้ที่ไม่เข้าร่วมกิจกรรมที่1
Date :
2009-11-28 01:25:02
By :
iieszz
Code (PHP)
select*from tb_member where not exists(select *from tb_register,tb_member,tb_activity where tb_register.id_act = tb_activity.id_act and tb_register.id_member=tb_member.id_member and tb_activity.id_act ='1')
ลองใช้คำสั่งนี้ใน phpMyAdmin แต่ค่าที่ออกเป็น
MySQL คืนผลลัพธ์ว่างเปล่ากลับมา (null / 0 แถว)
ทั้งๆที่สมาชิกแต่ละคนไม่ได้ลงทะเบียนกิจกรรมทุกกิจกรรม
Date :
2009-11-28 10:28:32
By :
iieszz
จากโค๊ดด่านบนก็ถูกแล้วนิครับ
SELECT *
FROM tb_member tm
INNER JOIN tb_register tr ON tm.id_member = tr.id_member
WHERE tr.id_act != '1'
แสดงรายชื่อ ผู้ที่ไม่เข้าร่วมกิจกรรมที่ 1
ก็ถูกแล้วนิครับ หรือว่ายังงัยหรอครับ
Date :
2009-11-28 10:41:30
By :
martman26
งง กับ คำ ถาม แล้ว ฟิลด์ ไหน ที่ จะ บ่ง บอก ว่า เค้า ผู้ นั้น ไม่ เข้า ร่วม ล่ะ ครับ อ ธิ บาย หน่อย
Date :
2009-11-28 11:05:33
By :
chubichane
SELECT *
FROM tb_member tm
INNER JOIN tb_register tr ON tm.id_member = tr.id_member
WHERE tr.id_act != '1'
จะเป็นการแสดงรายชื่อสมาชิกที่เข้าร่วมกิจกรรมอื่น(รวมๆกัน) โดยที่ไม่มีกิจกรรมที่ 1รววมอยู่ด้วย
ที่อยากได้ คือ แสดงผู้ที่ไม่เข้าร่วมกิจกรรมที่ 1 ออกมาอย่างเดียวเลยครับ (อย่างที่จะให้เป็นครับ)
ฟิลด์ id_act และ id_member ของ ตาราง tb_register = จะบอกว่าใครลงกิจกรรมอะไรไว้บ้าง
ฟิลด์ที่จะบอกว่าใครไม่ได้ลงทะเบียนกิจกรรมอะไร
ก็คือ เมื่อรู้ว่าใครลงกิจกรรมอะไรไว้ ก็นำฟิลด์ id_act ของ ตาราง tb_register ไปเทียบกับ ฟิลด์ id_act ของตารางtb_activity เพื่อหาว่า มีกิจกรรมที่ชื่ออะไรบ้าง ที่สมาชิกแต่ละคนยังไม่ได้ลงทะเบียน ก็จะได้ชื่อของกิจกรรมที่ยังไม่ได้ลงทะเบียนครับ
รู้หลักการแต่ว่า เรียบเรียงเป็นโค๊ดไม่ถูกครับ หรือว่ามีวิธีอื่นที่ง่ายกว่านี้ป่าวครับ
Date :
2009-11-28 11:59:30
By :
iieszz
ผลลัพท์ ที่ผมต้องการ คือ
คนที่ 4 ไม่เข้าร่วมกิจกรรม 1 ครับ
เพื่อจะออกเป็นรายงานว่า มีใครบ้างที่ไม่เข้าร่วมกิจกรรมที่1 นั่นก็คือคนที่4 ครับ
รบกวนหน่อยน่ะครับ งงๆงมๆมา 2 วันแล้ว
Code (PHP)
SELECT *
FROM tb_member tm
INNER JOIN tb_register tr ON tm.mem_id = tr.mem_id
WHERE tr.act_id != '1'
ผมลองมาปรับแล้วคีย์
Code (PHP)
(SELECT distinct(tm.id_member) ,tr.id_member,tr.id_act
FROM tb_member tm
INNER JOIN tb_register tr ON tm.id_member = tr.id_member
WHERE tr.id_act != '1' )
ได้ผลลัพธ์
id_member id_member id_act
1111111111 1111111111 3
1111111111 1111111111 4
2222222222 2222222222 2
2222222222 2222222222 3
4444444444 4444444444 3
*** ไม่มี id_act=1 รวมอยู่ด้วย นั่นก็คือ คนพวกนี้แหละที่ไม่เข้าร่วมกิจกรรมที่1
แต่เปิดดูจากตารางการลงทะเบียน(tb_register)แล้ว มี id_member=1111111111
id_reg id_member id_act id_barcode day_reg
1 1111111111 1 1 2009-11-25 14:48:07
2 2222222222 2 8 2009-11-26 11:04:21
3 1111111111 3 20 2009-11-26 12:44:54
4 2222222222 3 15 2009-11-26 13:09:29
5 4444444444 3 18 2009-11-26 13:19:35
6 1111111111 4 26 2009-11-26 16:22:45
**** จึงเป็นไปไม่ได้ ที่ id_member=1111111111 ยังไม่ได้ลงทะเบียนกิจกรรม id_act =1
Date :
2009-11-28 14:06:25
By :
iieszz
งง คนที่ 4 จะไม่เข้าร่วมได้ยังไง ในเมื่อเค้าลงทะเบียน เป็น กิจกรรม 1 อธิบายหน่อย
Date :
2009-11-28 14:36:51
By :
chubichane
ขอโทษที่ครับเข้าใจผิด(งงๆ)
ผลลัพท์ที่อยากได้ คือ
---------------------------
คนที่ 1 กิจกรรม 2
คนที่ 2 กิจกรรม 3
คนที่ 3 กิจกรรม 3
--------------------------- ***แต่คนที่4 อาจถูกเรียกกลับมาแสดงผล ถ้าคนที่4 ลงกิจกรรมอื่นที่ไม่ใช่1 เช่น กิจกรรมที่2,3 ซึ่งมันดูขัดๆกับความเป็นจริง
เพราะว่าเราต้องการแสดง id_member ที่ไม่ลงทะเบียนกิจกรรมที่1 ซึ่งจริงๆคนที่4 ได้ลงทะเบียนไปแล้ว
เนื่องจากหนึ่งคนลงได้หลายกิจกรรม (id_act)
ถ้าเรา select ตรง id_act != 1
มันจะแสดงเฉพาะสมาชิกที่มีรหัสกิจกรรมที่ไม่เท่ากับ1ตรงนี้ใช่ครับ
แต่ปัญหาที่ผมเจอคือ สมาชิกคนที่มี id_act = 1 มีก็ยังถูกเลือกขึ้นมาแสดง
เพราะว่าสมาชิกคนนั้นได้ลงทะเบียนกิจกรรมอื่น ที่ไม่เท่ากับ1 เช่น กิจกรรมที่3 (id_act = 3) ซึ่ง ก็ยังอยู่ในเงื่อนไขในการค้นหา
จึงถูกเรียกกลับขึ้นมาแสดงอีก
Date :
2009-11-28 14:55:45
By :
iieszz
ถ้าเราจะเขียนโค๊ดแบบว่า select ตรงที่ id_act != 1 แล้ว select ตรงที่ id_act = 1 ของสมาชิกคนนั้น ขึ้นมาเปรียบเทียบด้วย
ถ้า id_member ไหน ที่มีทั้ง id_act != 1 และ id_act = 1 อยู่ในตาราง tb_register ไม่ต้องให้เรียกข้อมูลผู้ที่ไม่ได้ลงทะเบียนของสมาชิกคนนั้นขึ้นมาแสดง น่าจะใช่เงื่อนไขของการแก้ปัญาของกระทู้ข้างบนป่าวครับ
ถ้าใช่โค๊ดน่าจะเป็นแบบไหนครับ(ได้แต่หลักการ โค๊ดไม่ค่อยแน่น)
Date :
2009-11-28 15:27:32
By :
iieszz
ผมเข้าใจล่ะ แต่เดี๋ยวให้ท่านอื่นมาตอบ อิอิ
คนนึงลงได้หลายกิจกรรม แต่เลือกคนที่ไม่ได้ลง กิจกรรมที่ 1
Date :
2009-11-28 15:32:18
By :
chubichane
ใช่เลยครับ
สิ่งที่ผมต้องการ เป็นแบบที่คุณ chubichane เข้าใจครับ
คนนึงลงได้หลายกิจกรรม แต่เลือกคนที่ไม่ได้ลง กิจกรรมที่ 1 หรือ สมาชิกคนไหนที่ไม่ลงกิจกรรมที่1 แต่ลงกิจกรรมอื่นก็ไม่ต้องเรียกมาแสดง
รุสึกงงๆ กับชีวิต เหมือนเรียน ตรรกศาสตร์ เลย มันวนไปวนมาไงไม่รู้
ช่วยหน่อยน่ะครับ
ระบบลงทะเบียนกิจกรรมผมจะได้ไปต่อได้
Date :
2009-11-28 15:47:56
By :
iieszz
Create Table
CREATE TABLE `tb_member` (
`mem_id` int(3) NOT NULL,
`mem_name` varchar(20) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- dump ตาราง `tb_member`
--
INSERT INTO `tb_member` VALUES (1, 'ทดสอบ 1');
INSERT INTO `tb_member` VALUES (2, 'ทดสอบ 2');
INSERT INTO `tb_member` VALUES (3, 'ทดสอบ 3');
INSERT INTO `tb_member` VALUES (4, 'ทดสอบ 4');
CREATE TABLE `tb_register` (
`mem_id` int(3) NOT NULL,
`act_id` int(1) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- dump ตาราง `tb_register`
--
INSERT INTO `tb_register` VALUES (1, 2);
INSERT INTO `tb_register` VALUES (2, 3);
INSERT INTO `tb_register` VALUES (4, 3);
INSERT INTO `tb_register` VALUES (4, 1);
INSERT INTO `tb_register` VALUES (1, 4);
INSERT INTO `tb_register` VALUES (1, 3);
INSERT INTO `tb_register` VALUES (3, 3);
INSERT INTO `tb_register` VALUES (4, 4);
CREATE TABLE `tb_activity` (
`act_id` int(1) NOT NULL,
`act_name` varchar(20) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- dump ตาราง `tb_activity`
--
INSERT INTO `tb_activity` VALUES (1, 'กิจกรรม 1');
INSERT INTO `tb_activity` VALUES (2, 'กิจกรรม 2');
INSERT INTO `tb_activity` VALUES (3, 'กิจกรรม 3');
INSERT INTO `tb_activity` VALUES (4, 'กิจกรรม 4');
SQL คนที่ไม่ได้ลงกิจกรรมที่ 1
SELECT * FROM tb_member tb LEFT JOIN tb_register tr ON (tb.mem_id=tr.mem_id)
WHERE tr.act_id != 1 GROUP BY tb.mem_id
ผลลัพท์
คนที่ 1
คนที่ 2
คนที่ 3
คนที่ 4
SQL คนที่ไม่ได้ลงกิจกรรมที่ 3
SELECT * FROM tb_member tb LEFT JOIN tb_register tr ON (tb.mem_id=tr.mem_id)
WHERE tr.act_id != 3 GROUP BY tb.mem_id
ผลลัพท์
คนที่ 1
คนที่ 4
ok มัยครับ ต่อให้ 1 คนลงได้หลายกิจกรรม ก็เถอะ ยังงัย sql มันก็ไม่ดึงคนที่ เรา where ไปอยู่แล้ว หรือถ้าไม่ใช่อีก
ผมแนะนำ ให้ทำเป็น Excle ถึงผลลัพท์ที่ต้องการ แสดงเป็นรูปภาพ ให้โชว์
มาโพสให้ดูหน่อยนะครับ พร้อม ฐานข้อมูลด้วย
Date :
2009-11-28 16:14:08
By :
martman26
ถ้าเราใช้ WHERE tr.act_id = '1'
เราก็จะได้เป็นคนที่มี ไอดีกิจกรรมเป็น 1 ครับ
แต่ที่ต้องการจริงๆ คือคนที่ ไม่มีไอดีกิจกรรมเป็น1
------------------------------------------------------------------------
จากโค๊ด
SELECT *
FROM tb_member tm
INNER JOIN tb_register tr ON tm.id_member = tr.id_member
WHERE tr.id_act != '1'
------------------------------------------------------------------------
ตารางลงทะเบียนกิจกรรม
id_reg id_member id_act id_barcode day_reg
1 1111111111 1 1 2009-11-25 14:48:07
2 2222222222 2 8 2009-11-26 11:04:21
3 1111111111 3 20 2009-11-26 12:44:54
4 2222222222 3 15 2009-11-26 13:09:29
5 4444444444 3 18 2009-11-26 13:19:35
6 1111111111 4 26 2009-11-26 16:22:45
--------------------------------------------------------------------------------------------------------------------------------------
ผลลัพธ์ที่ได้ต้องไม่มี id_member ของสมาชิกแถวสีเขียว ออกมาแสดง
แต่ id_member ของสมาชิกแถวสีเขียว กลับโผล่ขึ้นมาอีก(แถวสีแดงอีก 2 แถว)
เพราะว่า id_member ของสมาชิกแถวสีเขียว(1 id_member ลงได้หลายกิจกรรม) ได้ลงกิจกรรม id_act อื่นด้วย
จึงแสดงแถวสีแดง 2 แถวออกมา
ซึ่งถือว่าผิดเงื่อนไขของการค้นหา ถึงแม้ว่า จะเป็น id_act ของกิจกรรมอื่น แต่ก้ยังเป็นคนเดียวกันที่มี
id_member =1111111111 อยู่ดี ***ถ้าเป็นเคสแบบนี้ผมไม่ต้องการให้ข้อมูลสมาชิกคนนี้ (id_member =1111111111) ออกมาแสดงเลย
Date :
2009-11-28 16:24:12
By :
iieszz
ตารางลงทะเบียนกิจกรรม
id_reg id_member id_act id_barcode day_reg
1 1111111111 1 1 2009-11-25 14:48:07
2 2222222222 2 8 2009-11-26 11:04:21
3 1111111111 3 20 2009-11-26 12:44:54
4 2222222222 3 15 2009-11-26 13:09:29
5 4444444444 3 18 2009-11-26 13:19:35
6 1111111111 4 26 2009-11-26 16:22:45
ผลลัพธ์อยากให้เป้นอย่างนี้ใช่ไหมครับ (อธิบายให้คนอื่นดู อิอิ)
id_member
222222222
444444444
* 2 คนนี้ไม่ได้เข้าร่วมกิจกรรมที่ 1
Date :
2009-11-28 16:41:49
By :
chubichane
เข้าใจล่ะ ต้อง where NOT IN subquery
ผมจะลองช่วยดูนะครับ
แหมม เลิกงานแล้วด้วยสิ
พรุ่งนี้ถ้ายังไม่มีใครตอบผมจะมาช่วยครับ
Date :
2009-11-28 17:31:47
By :
martman26
ขอบคุณ คุณ MarT คุณ C h u |3 i @ M U T คุณ vee มากๆ น่ะครับ
ที่ร่วมด้วยช่วยกัน ทั้งวัน(มึนๆกันเลยทีเดว)
พรุ่งนี้ คุณ MarT มาช่วยผมอีกวันน่ะครับ(ไม่น่าเลิกงานก่อนเลย เกือบได้แล้วเชียว..ฮ่าๆ เริ่มมีความหวัง)
ขอบคุณๆจากใจครับ
*** พี่ๆท่านใดเข้าใจแนวคิดของผม เข้ามาช่วยหน่อยน่ะครับ
Date :
2009-11-28 17:37:29
By :
iieszz
ขอบคุณ คุณ MarT มากๆน่ะครับ
ที่มาช่วยผมแก้ปัญหาครั้งนี้ของผม
และทำให้ผมได้รู้ว่า sql ไม่ได้มีแต่ select*from tb
มันยังมีอะไรที่ผมต้องเรียนรู้อีกเยอะ
พี่เป็นโปรแกรมเมอร์อยู่หรือเปล่าครับ(ผมน่าจะเป็นรุ่นน้อง ดูจากฝีมือแล้ว)
ถ้าขอเมลล์พอจะให้ได้เปล่าครับ
***เปลี่ยนสีก็คลิกเมาท์คลุมดำเนื้อหา แล้วก็เลือกสีครับ
**** ถ้ามีเวลาว่างๆ ช่วยอธิบายแนวคิดในการเขียนโค๊ด select ขั้นเทพ ที่ join แล้ว join อีก จนได้คำตอบ ให้ผมมั่งน่ะครับ(แบบว่าคิดได้ แต่ทำไม่ค่อยได้ )
Date :
2009-11-29 00:29:02
By :
iieszz
Load balance : Server 05