ปรึกษา PHP คำสั่ง MySQL Between หาค่าไอดี 2 ตารางหน่อยครับ
ดูแล้วงง ๆ น่ะครับ ว่าแต่ได้ดูพวก SUB SELECT หรือ EXISTS บ้างหรือเปล่าครับ มันสามารถเลือกรายการที่ "มีอยู่ " หรือ "ไม่มีอยู่ " ได้ครับ
Date :
2014-09-23 14:46:15
By :
mr.win
ยังเลยครับ
ผมอยากได้ busid ที่ไม่มีใน table : booking_detail ในช่วงวันเวลานั้นๆ อ่ะครับ
Date :
2014-09-23 17:30:44
By :
coolkidz
ก็ตามที่ผมแนะนำครับ พวก SUB SELECT เช่น IN / NOT IN / EXISTS ครับ ทำได้ไม่ยาก
Date :
2014-09-23 17:34:43
By :
mr.win
ครับ จะลองดูครับ ขอบคุณคับ
Date :
2014-09-23 17:52:06
By :
coolkidz
พี่ TC Admin ผมลองใช้ตามที่พี่แนะนำ มันออกแต่มาแต่ข้อมูล busid หมดเลย 1 2 3 มันไม่ยอมออก 2 กับ 3 ครับ
Code (SQL)
select * from bus left join booking_detail on bus_id = booking_detail_busid where booking_detail_busid is null and size='1' and bus_status not in('3','2')
อันนี้เป็นโค้ดชุดเก่าที่ผมใช้ แต่ว่า ถ้า bus_id ตัวไนเคยใช้ไปแล้ว เวลาเรียกจอง จะไม่สามารถใช้งานได้
**ถ้าเคยจอง 1 ไปแล้ว เว่ลาไปจองวันที่อื่น มันก็จะจองไม่ได้ (ความจริงแล้ว จะต้องสามารถจองได้)
TABLE : bus
TABLE : booking_detail
ที่ booking_detail_busid ยังเป็น 0 คือรายการที่ยังไม่มีการเลือกรถบัส
รบกวนพี่ๆหน่อยผมคิดไม่ออก จะครบสัปดาห์แล้ว T_T
ประวัติการแก้ไข 2014-09-23 20:40:48
Date :
2014-09-23 20:39:56
By :
coolkidz
อันดับแรก คุณตองการวัน ที่ว่าง ดังตั้นคุณต้องมี วันที่ของทุกวันที่ค้นหา
ตรงนี้ผม ไม่รู้ว่าจะใช้คิวรี่ ง่ายๆ โดยไม่ใช้ union ยังไง
และผมคิดว่าคุณมี ตาราง bus มีฟีลด์ busid อยู่ด้วยนะครับ
Code (PHP)
<?php
function create_union_date( $st, $en){
list($y, $m, $d)=explode('-', $st);
$mkdate=''; $union_sql='';
while( $mkdate<$en){
$mkdate=date('Y-m-d', mktime(0,0,0, $m, $d, $y)); $d++;
$union_sql .= ($union_sql>''? ' union ' : '' ) . " select '$mkdate' as dte \n" ;
}
return $union_sql;
}
$st='2014-10-01';
$en='2014-10-31';
$qr='
select bus_list.* from (
select t.dte, bus.busid from ( ' . create_union_date( $st, $en) . ') as t
left join bus
) as bus_date
left join bus_detail
on bus_date.busid = bus_detail.bus_id
and bus_date.dte between bus_detail.booking_strdate and bus_detail.booking_enddate
where bus_detail.busid is null
order by bus_date.dte, bus_date.busid ';
?>
ประวัติการแก้ไข 2014-09-24 08:13:43 2014-09-24 08:15:07
Date :
2014-09-24 08:12:11
By :
Chaidhanan
เยี่ยมจริง ๆ
Date :
2014-09-24 09:36:32
By :
mr.win
ขอบคุณครับ สำหรับแนวทาง ผมจะพยายามต่อไป
ขอบคุณพี่ Chaidhanan แล้วก็เว็บบอร์ดดีๆ แบบนี้ สู้ต่อไปทาเคชิ ^^
Date :
2014-09-24 12:34:49
By :
coolkidz
พี่ Chaidhanan รบกวนอีกนิดครับผม พอดีผมมี แค่ Table : bus กับ booking_detail ที่มี
TABLE :
bus มี bus_id (PK)
booking_detail มี booking_detail_busid (FK)
น่ะครับเพื่อใช้อ้างอิง
งงครับชุดโค้ดที่พี่ให้มานิดหน่อย มี bus_list กับ bus_detail มาด้วย งงเลย ล้ำลึกมาครับ นับถือ
รบกวนพี่ Chaidhanan อีกนิดหน่อยนะครับ ^^
Code (PHP)
$sql = ""select * from bus left join booking_detail on bus_id = booking_detail_busid where booking_detail_busid is null and size='1' and bus_status not in('3')";
โค้ดชุดนี้ เป็นชุดเก่าที่พี่เคยให้ผมไปครั้งนึง ซึ่งมันใช้ได้ครับ แต่มันไม่ได้คำนวณวันนี้ คือมันจะหาว่า bus_id ไหนที่มีใน table : booking_detail ฟิลด์ booking_detail_busid มันจะไม่แสดง มันจะแสดง รายการ bus_id ที่เหลือใน table : bus ผมคิดว่าโค้ดชุดนี้น่าจะช่วยได้เยอะ แต่ผมผสม between ไม่เป็น ลองหลายรอบแล้ว มันก็ไม่ออก ถ้ามันนำมาคำนวณกับวันที่ได้ัมันจะพอดีกับโจทย์เลยครับ
ประวัติการแก้ไข 2014-09-25 02:22:30 2014-09-25 02:23:50
Date :
2014-09-25 02:19:47
By :
coolkidz
แก้ไขครับ ฐานข้อมูลผิดพลาด จิงแล้ว จะต้องเป็นตามนี้ ผมใส่ bus_id ใน booking_detail ผิด จิงๆต้องเป็น bus_id ที่ 21 ซึ่งเป็นขนาดเล็ก
tb : bus
tb : booking_detail
สานฝันโปรแกรมมิ่งต่อไป
Date :
2014-09-25 02:47:46
By :
coolkidz
bus_date เป็น alias name ของ temporarily table ครับ
เดิมจะใช้ bus_list แต่ไม่สื่อความหมายตามข้อมูล เลยเปลียนเป็น bus_date แต่ลบไม่หมดอะครับ 55
bus_detail แก้ให้เป็น booking_detail
แบบอ่านมาแล้วจับมากระเดียดเอาเองอะครับ
เวลา เขียน โค๊ดมันมองไม่เห็นข้อมูลที่ให้มา เลยเพี้ยนไปนิดหน่อย
ส่วนไม่เอาคันที่ 3 ก็ใส and bus_id <>3 เข้าไปด้วยครับ
where booking_detail.busid is null and bus_date.busid <>3
ตัวอย่างผม โชว์รถที่ว่างเรียงตามวันที่
สำหรับ busid หรือ bus_id แก้ให้ตรงกับความจริงเอานะครับ
นี่เป็นแต่ตัวอย่างเขียนขึ้นโดยไม่มีการทดสอบนะครับ
Date :
2014-09-25 08:13:28
By :
Chaidhanan
ครับ เดี่ยวผมจะลองทดสอบ เมื่อคืนวุ่นทั้งคืน ไม่ออก มันออกแต่รถที่จองไปแล้ว T_T
Date :
2014-09-25 12:15:29
By :
coolkidz
Error ครับ พี่ Chaidhanan
Code
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in D:\AppServ\www\lab.php on line 32
Code (PHP)
<?
function create_union_date( $st, $en){
list($y, $m, $d)=explode('-', $st);
$mkdate=''; $union_sql='';
while( $mkdate<$en){
$mkdate=date('Y-m-d', mktime(0,0,0, $m, $d, $y)); $d++;
$union_sql .= ($union_sql>''? ' union ' : '' ) . " select '$mkdate' as dte \n" ;
}
return $union_sql;
}
$st='2014-09-25';
$en='2014-09-26';
$qr='
select bus_list.* from (
select t.dte, bus.bus_id from ( ' . create_union_date( $st, $en) . ') as t left join bus ) as bus_date
left join booking_detail
on bus_date.bus_id = booking_detail.booking_detail_busid
and bus_date.dte between booking_detail.booking_strdate and booking_detail.booking_enddate
where booking_detail.booking_detail_busid is null order by bus_date.dte, bus_date.bus_id ';
$query = mysql_query($qr);
while($db = mysql_fetch_array($query)) {
echo $db['bus_code']."<br />";
}
?>
ประวัติการแก้ไข 2014-09-25 16:48:41
Date :
2014-09-25 16:48:10
By :
coolkidz
Code (PHP)
$st='2014-09-25';
$en='2014-09-26';
$qr="select * from bus left join booking_detail on bus_id=booking_detail_busid
where booking_strdate='$st' and booking_enddate='$en' ";
ชุดนี้ทำให้ tb : booking_detail ได้ข้อมูล booking_detail_busid = 21
Code (PHP)
$st='2014-09-25';
$en='2014-09-26';
$qr="select * from bus left join booking_detail on bus_id=booking_detail_busid
where booking_strdate='$st' and booking_enddate='$en' and booking_detail_busid is null ";
ชุดไม่มข้อมูลอะไรเลย เกิดจากอะไรครับ เพียงแค่เพิ่มเงื่อนไข มา 2 อัน ทำให้ข้อมูลไม่ออกมา แต่ถ้าตัด booking_strdate กับ booking_enddate ออกไป ทำใหข้อมูลออกมาหมดเลย
Date :
2014-09-25 17:01:34
By :
coolkidz
code ข้างล่างที่ทดลองแล้วใช้งานได้
Code (SQL)
CREATE TABLE IF NOT EXISTS `booking_detail` (
`id` int(10) unsigned NOT NULL,
`busid` int(10) unsigned NOT NULL,
`user` int(11) unsigned NOT NULL,
`date_st` date NOT NULL,
`date_en` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;
INSERT INTO `booking_detail` (`id`, `busid`, `user`, `date_st`, `date_en`) VALUES
(1, 1, 1, '2014-09-26', '2014-09-27'),
(2, 2, 2, '2014-09-27', '2014-09-28');
CREATE TABLE IF NOT EXISTS `bus` (
`busid` int(10) unsigned NOT NULL,
`bussize` varchar(80) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ;
INSERT INTO `bus` (`busid`, `bussize`) VALUES
(1, 'small'),
(2, 'midium'),
(3, 'large'),
(4, 'super');
Code (PHP)
<?php
function create_union_date( $st, $en){
list($y, $m, $d)=explode('-', $st);
$mkdate=''; $union_sql='';
while( $mkdate<$en){
$mkdate=date('Y-m-d', mktime(0,0,0, $m, $d, $y)); $d++;
$union_sql .= ($union_sql>''? ' union ' : '' ) . " select '$mkdate' as dte \n" ;
}
return $union_sql;
}
$hk=new mysqli('localhost', 'test', 'test', 'test');
$st='2014-09-26';
$en='2014-09-30';
$qr='
select bus_date.* from (
select t.dte, bus.busid from ( ' . create_union_date( $st, $en) . ') as t , bus
) as bus_date
left join booking_detail
on bus_date.busid = booking_detail.busid
and bus_date.dte between booking_detail.date_st and booking_detail.date_en
where booking_detail.busid is null
order by bus_date.dte, bus_date.busid ';
$rs = $hk->query($qr) or die( $qr . "<br>\n" . $hk->error);
?><!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
</head>
<body>
<?php
while($ro = $rs->fetch_assoc() ) {
echo $ro['dte'], "==", $ro['busid']."<br />";
}
?>
</body>
</html>
2014-09-26==2
2014-09-26==3
2014-09-26==4
2014-09-27==3
2014-09-27==4
2014-09-28==1
2014-09-28==3
2014-09-28==4
2014-09-29==1
2014-09-29==2
2014-09-29==3
2014-09-29==4
2014-09-30==1
2014-09-30==2
2014-09-30==3
2014-09-30==4
Date :
2014-09-25 20:42:06
By :
Chaidhanan
ขอบคุณมากครับ สำหรับความช่วยเหลือ สุดยอดยกนิ้วเลย
Date :
2014-09-25 23:57:23
By :
coolkidz
Load balance : Server 05