 |
รบกวนสอบถามเรื่อง mysql กับ การ ใช้ เงื่อนไข OR AND ครับ |
|
 |
|
|
 |
 |
|
พยายามเอาวงเล็บครอบจัดกลุ่มไว้ ไม่ให้มันมั่ว
อันไหนควรอยู่ในกลุ่มไหนก็แล้วแต่จะเขียน
ตัวอย่าง
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 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
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 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
แวะมาส่งการบ้านครับ
สรุปคือใช้วงเล็บสามารถทำได้ครับ แต่ดันไปติดปัญหา แบบ มันประกาศชื่อฟิลซ้ำไม่ได้ ผมเขียนถูกไหมครับ
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 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เวลาที่ผมคิวรี่แล้วได้ข้อมูลไม่ถูกต้อง จะใช้วิธีเอาข้อมูลมาวางในตารางเช่น Excel
แล้วก็พิสูจน์ทีละเงื่อนไขครับว่าได้ตามที่ต้องการหรือเปล่า

เมื่อเอาข้อมูลมาเทียบ จะเจอว่า AND หรือ OR หรือ ค่าใดที่ผิดครับ
จากนั้นก็เรื่องเขียน if else ให้ครอบคลุมทุกกรณี
|
 |
 |
 |
 |
Date :
2021-08-19 09:08:22 |
By :
{Cyberman} |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
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 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|