 |
ปรึกษา 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 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|