Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,037

HOME > PHP > PHP Forum > รบกวนสอบถามเรื่อง mysql กับ การ ใช้ เงื่อนไข OR AND ครับ



 

รบกวนสอบถามเรื่อง mysql กับ การ ใช้ เงื่อนไข OR AND ครับ

 



Topic : 136341



โพสกระทู้ ( 209 )
บทความ ( 1 )



สถานะออฟไลน์




ชุดคำสั่งที่ผมต้องการใช้ครับ ตอนค้นหา
จะมี radio ให้คลิก + กับเเลือกช่วงวันที่ได้ ผมลองเขียนแบบนี้ปรากฎว่า เลือกพร้อมกัน ทั้ง 2 เงื่อนไข มันไม่ออกครับ

Code (PHP)
select*from tb_personal_doc where concat(send_title,',',send_num) like '%%' AND owner LIKE 'personal1' AND send_date BETWEEN '2021-08-09' AND '2021-08-09'


ส่วนอันนี้ เลือก 2 เงื่อนไข ผลลัพธ์ออกมาครับ แต่ไม่ถูกต้องมันออกมาทั้ง ช่วงวันที่ของคนอื่น และของตัว radio ที่เราเลือก

Code (PHP)
select*from tb_personal_doc where concat(send_title,',',send_num) like '%%' AND owner LIKE 'personal1' OR send_date BETWEEN '2021-08-09' AND '2021-08-09'


ก็เลยอยากทราบว่า มันต่างยังไง ครับ กรณี เขียนแบบนี้ถูกต้องไหมครับ โดยไม่ใช้วิธี ต่อสตริงครับ

อีกข้อครับ
กรณีเราเก็บข้อมูลชื่อกับนามสกุลคนละฟิลด์ เวลาค้น Like %นายมงคล จันดี% มันต้องเขียนยังไง ครับ เพราะ Like 2 คอลั่มหรือใช้ Concat ก็ไม่ได้ครับ หรือผมเขียนไม่ถูกก็ไม่รู้ครับ ช่วยแนะนำทีครับ ว่า ใช้ หลักการไหนในการเขียน mysql statement ขอบคุณครับ



Tag : PHP, MySQL







Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2021-08-18 23:56:07 By : gmgo View : 689 Reply : 6
 

 

No. 1



โพสกระทู้ ( 4,756 )
บทความ ( 8 )



สถานะออฟไลน์


พยายามเอาวงเล็บครอบจัดกลุ่มไว้ ไม่ให้มันมั่ว
อันไหนควรอยู่ในกลุ่มไหนก็แล้วแต่จะเขียน

ตัวอย่าง

A หรือ B เท่ากับ 10 และ C เท่ากับ 20
ถ้าจะจัดกลุ่มเอา A หรือ B ก็ได้ อันใดอันหนึ่งเป็นจริงก็คือใช้ได้ แต่ C ก็ต้องมีเงื่อนไขเป็นจริงด้วย
แบบนี้ก็เอาวงเล็บคลุม (A OR B) AND C

แต่ถ้าจะเอา B จะต้องเท่ากับ 10 และ C จะต้องเท่ากับ 20 ด้วย เงื่อนไขจึงจะเป็นจริง ในขณะที่เงื่อนไขกลุ่มนี้ ถ้าไม่เป็นจริงยังไง A ก็ต้องเท่ากับ 10
แบบนี้ก็จะเป็นกลุ่ม B และ C แบบนี้ A OR (B AND C)

ยกตัวอย่างให้ชัดขึ้นเป็นโค้ด
กลุ่ม A หรือ B
WHERE (A = 10 OR B = 10) AND C = 20

กลุ่ม B และ C
WHERE A = 10 OR (B = 10 AND C = 20)

หวังว่าวงเล็บจะช่วยแก้ปัญหาได้






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2021-08-19 00:38:27 By : mr.v
 


 

No. 2



โพสกระทู้ ( 4,756 )
บทความ ( 8 )



สถานะออฟไลน์


A = 10 OR B = 10 AND C = 20

จัดกลุ่มใหม่

(A = 10 OR B = 10) AND C = 20
ถ้า A หรือ B อันใดอันหนึ่งเป็นจริง หรือทั้งสองอันเป็นจริง
และ C ก็ต้องเป็นจริงด้วย จะได้ผลลัพธ์

A = 10 OR (B = 10 AND C = 20)
ถ้า A เป็นจริงเพียงอย่างเดียว หรือ กลุ่ม B และ C ต้องเป็นจริงทั้งคู่ จึงจะได้ผลลัพธ์
คือถ้า A ก็เป็นจริง กลุ่มหลังก็เป็นจริง = ผ่าน
A เป็นจริง กลุ่มหลังไม่เป็นจริงเพราะ (B กับ C ไม่จริงเลยหรือจริงอันเดียว) = ไม่ผ่าน
A ไม่เป็นจริง ส่วนกลุ่มหลังเป็นจริงแค่อันเดียว = ไม่ผ่าน เพราะติดเงื่อนไข AND ต้องเป็นจริงทั้งคู่

ขยายความเพิ่มเติมเพราะไม่รู้จะงงมั้ย แรกๆผมก็งงกับอย่างนี้เหมือนกัน แต่พอเข้าใจแล้วมันช่วยให้ง่ายขึ้นเยอะ


ประวัติการแก้ไข
2021-08-19 00:45:33
2021-08-19 00:47:17
2021-08-19 00:47:43
2021-08-19 01:34:33
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2021-08-19 00:44:41 By : mr.v
 

 

No. 3



โพสกระทู้ ( 209 )
บทความ ( 1 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 2 เขียนโดย : mr.v เมื่อวันที่ 2021-08-19 00:44:41
รายละเอียดของการตอบ ::
ขอบคุณครับ กรณีใช้วงเล็บเดี๋ยวลองนำไปใช้ครับคิดว่าน่าจะพอมองออกละครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2021-08-19 01:11:23 By : gmgo
 


 

No. 4



โพสกระทู้ ( 209 )
บทความ ( 1 )



สถานะออฟไลน์


แวะมาส่งการบ้านครับ

สรุปคือใช้วงเล็บสามารถทำได้ครับ แต่ดันไปติดปัญหา แบบ มันประกาศชื่อฟิลซ้ำไม่ได้ ผมเขียนถูกไหมครับ

Code (PHP)
$sql="select*from tb_personal_doc where concat(send_title,',',send_num) like '%$strkeyword%' AND (owner = '$strp1' AND send_date BETWEEN '$strsdate_search' AND '$stredate_search')";


แบบนี้ได้ครับ แต่ เงื่อนไขต้องเป็นจริงทั้ง 3 ตัว $strp1 $strsdate_search $stredate_search แต่ถ้าหาเฉพาะ ตัวใดตัว 1 ใน 3 ตัวนี้เงื่อนไขเป็นเท็จทันที ก็เลยต้องมาใช้ IF เอาอีกทีครับ ขอบคุณมากครับ

ส่วนอันนี้ที่ใช้ IF
Code (PHP)
if(empty($strkeyword) && empty($strp1) && empty($strsdate_search) && empty($stredate_search)){
echo $sql="select*from tb_personal_doc where 1";
}elseif(!empty($strsdate_search) && !empty($stredate_search)){
echo $sql="select*from tb_personal_doc where send_date BETWEEN '$strsdate_search' AND '$stredate_search'";
}elseif(!empty($strp1) && !empty($strsdate_search) && !empty($stredate_search)){
echo $sql="select*from tb_personal_doc where  owner = '$strp1' AND send_date BETWEEN '$strsdate_search' AND '$stredate_search'";
}else{
echo $sql="select*from tb_personal_doc where  concat(send_title,',',send_num) like '%$strkeyword%' AND owner = '$strp1'";
}



ประวัติการแก้ไข
2021-08-19 01:59:50
2021-08-19 01:59:56
2021-08-19 02:01:09
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2021-08-19 01:59:11 By : gmgo
 


 

No. 5



โพสกระทู้ ( 1,994 )
บทความ ( 10 )



สถานะออฟไลน์
Facebook Blogger

เวลาที่ผมคิวรี่แล้วได้ข้อมูลไม่ถูกต้อง จะใช้วิธีเอาข้อมูลมาวางในตารางเช่น Excel
แล้วก็พิสูจน์ทีละเงื่อนไขครับว่าได้ตามที่ต้องการหรือเปล่า

พิสูจน์เงื่อนไข

เมื่อเอาข้อมูลมาเทียบ จะเจอว่า AND หรือ OR หรือ ค่าใดที่ผิดครับ
จากนั้นก็เรื่องเขียน if else ให้ครอบคลุมทุกกรณี
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2021-08-19 09:08:22 By : {Cyberman}
 


 

No. 6



โพสกระทู้ ( 4,756 )
บทความ ( 8 )



สถานะออฟไลน์


Code (PHP)
$sql = 'SELECT * FROM `tb_personal_doc` WHERE 1';
if (isset($strsdate_search) && !empty($strsdate_search) && isset($stredate_search) && !empty($stredate_search)) {
    $sql .= ' AND (`send_date` BETWEEN :start_date AND :end_date)';
}
if (isset($strp1) && !empty($strp1)) {
    $sql .= ' AND `owner` = :owner';
}
$sql .= ' AND CONCAT(`send_title`, ', ', `send_num`) LIKE :searchkeyword';


ใช้ prepare แทนต่อสตริง
ตรวจเงื่อนไข AND, OR ให้ดีๆ ทำความเข้าใจเป็นตรรกะว่ามันควรจะใช้อันไหนกันแน่ แล้วก็จัดกลุ่มวงเล็บอย่างที่ว่าด้วย
ที่ว่าประกาศชื่อฟิลด์ซ้ำไม่ได้ ไม่ได้ยังไง ตรงไหนซ้ำ เพราะไม่เห็นตัวอย่างที่ว่าซ้ำแล้วไม่ได้เลยก็ไม่รู้จะบอกยังไง

การค้นหาคำค้นใน 2 ฟิลด์ ควรใช้ OR เช่น
Code (SQL)
WHERE (`name` LIKE '%คำค้น%' OR `lastname` LIKE '%คำค้น%')

คือหาชื่อหรือนามสกุลตามคำค้น เงื่อนไขอย่างใดอย่างหนึ่งเป็นจริง กลุ่มในวงเล็บนั้นก็คือเป็นจริงเพราะใช้ OR
แต่ถ้า
Code (SQL)
WHERE (`name` LIKE '%คำค้น%' AND `lastname` LIKE '%คำค้น%')

แบบนี้ ทั้งชื่อและนามสกุลต้องมีคำที่ค้นเหมือนกัน จึงจะเงื่อนไขเป็นจริง เช่น ชื่อสมหมาย นามสกุลสมหมาย ค้นคำว่าสมหมาย จึงจะพบ แต่จะมีกี่คนที่ชื่อกับนามสกุลเหมือนกัน. ดังนั้นใช้ OR
ทำความเข้าใจให้ดีแน่ๆซะก่อน เรื่องการจัดกลุ่ม เพราะไม่งั้นมันมีปัญหาตลอดแล้วก็จะไปเขียนอะไรพร่ำเพรื่อหนักเกินจำเป็น
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2021-08-19 13:21:12 By : mr.v
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : รบกวนสอบถามเรื่อง mysql กับ การ ใช้ เงื่อนไข OR AND ครับ
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: นำเข้าสินค้าจากจีน, Taobao, เฟอร์นิเจอร์, ของพรีเมี่ยม, ร่ม, ปากกา, power bank, แฟลชไดร์ฟ, กระบอกน้ำ

Load balance : Server 03
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่