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 > ปรึกษา PHP คำสั่ง MySQL Between หาค่าไอดี 2 ตารางหน่อยครับ



 

ปรึกษา PHP คำสั่ง MySQL Between หาค่าไอดี 2 ตารางหน่อยครับ

 



Topic : 111477



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



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




ตัวอย่างข้อมูล
TABLE : bus มี busid 3 id คือ 1 2 3

ตามรางจอง
ิbooking1


จากภาพ ดูฟิลด์ booking_detail_busid ซึ่งจะมีค่าเป็น 0 เกือบทั้งหมดนั่นคือยังไม่ได้เลือกรหัสรถบัส แต่จะมี booking_detail_bookid ที่เลือกรหัสรถบัสไปแล้ว คือ busid 1 ในวันที่ 25-26 กันยายน 2557

จุดประสงค์คือ ผมอยากจะให้รถบัสที่เหลือแสดงออกมาให้ผู้ใช้งานเลือก นั่นคือ 2 , 3 แต่....

ถ้าสังเกตดีๆ ที่ผมไฮไลท์ไว้เป็นวันที่ 25-26 กันยายน 2557 ทั้งหมด ดังนั้น รถบัสจะแสดงรถบัสที่เหลือทั้งหมด 2 คัน นั่นคือ 2 , 3

แต่ถ้าหากว่า busid 2 , 3 ถูกเลือกไปอยู่ใน booking_detail_bookid อันใดอันหนึ่ง ก็จะถูกหักไปด้วย

ผมงมมาหลายวันแล้วครับ รบกวนพี่ๆ แนะนำหน่อยส่วนผมก็จะพยายามต่อไปครับ เผื่อจะคิดออก ขอบคุณครับ



Tag : PHP, HTML/CSS, Ajax, CakePHP









ประวัติการแก้ไข
2014-09-23 00:39:53
Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2014-09-23 00:36:31 By : coolkidz View : 2179 Reply : 18
 

 

No. 1



โพสกระทู้ ( 74,058 )
บทความ ( 838 )

สมาชิกที่ใส่เสื้อไทยครีเอท

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

ดูแล้วงง ๆ น่ะครับ ว่าแต่ได้ดูพวก SUB SELECT หรือ EXISTS บ้างหรือเปล่าครับ มันสามารถเลือกรายการที่ "มีอยู่" หรือ "ไม่มีอยู่" ได้ครับ






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-09-23 14:46:15 By : mr.win
 


 

No. 2



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



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


ยังเลยครับ

ผมอยากได้ busid ที่ไม่มีใน table : booking_detail ในช่วงวันเวลานั้นๆ อ่ะครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-09-23 17:30:44 By : coolkidz
 

 

No. 3



โพสกระทู้ ( 74,058 )
บทความ ( 838 )

สมาชิกที่ใส่เสื้อไทยครีเอท

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

ก็ตามที่ผมแนะนำครับ พวก SUB SELECT เช่น IN / NOT IN / EXISTS ครับ ทำได้ไม่ยาก
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-09-23 17:34:43 By : mr.win
 


 

No. 4



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



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


ครับ จะลองดูครับ ขอบคุณคับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-09-23 17:52:06 By : coolkidz
 


 

No. 5



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



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


พี่ 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
bus

TABLE : booking_detail
sdg

ที่ booking_detail_busid ยังเป็น 0 คือรายการที่ยังไม่มีการเลือกรถบัส
รบกวนพี่ๆหน่อยผมคิดไม่ออก จะครบสัปดาห์แล้ว T_T


ประวัติการแก้ไข
2014-09-23 20:40:48
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-09-23 20:39:56 By : coolkidz
 


 

No. 6



โพสกระทู้ ( 9,586 )
บทความ ( 2 )



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


อันดับแรก คุณตองการวัน ที่ว่าง ดังตั้นคุณต้องมี วันที่ของทุกวันที่ค้นหา
ตรงนี้ผม ไม่รู้ว่าจะใช้คิวรี่ ง่ายๆ โดยไม่ใช้ 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
 


 

No. 7



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

สมาชิกที่ใส่เสื้อไทยครีเอท Hall of Fame 2012

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


ตอบความคิดเห็นที่ : 6 เขียนโดย : Chaidhanan เมื่อวันที่ 2014-09-24 08:12:11
รายละเอียดของการตอบ ::
เมื่อไรมีงานใหญ่ join หลาย ๆ ตาราง ต้องการคิวรี่ง่าย ๆ ต้องรบกวนคุณพี่บ้างแล้วครับ ยอดเยี่ยมจริง ๆ



ประวัติการแก้ไข
2014-09-24 09:44:20
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-09-24 09:29:44 By : apisitp
 


 

No. 8



โพสกระทู้ ( 74,058 )
บทความ ( 838 )

สมาชิกที่ใส่เสื้อไทยครีเอท

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

เยี่ยมจริง ๆ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-09-24 09:36:32 By : mr.win
 


 

No. 9



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



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



ขอบคุณครับ สำหรับแนวทาง ผมจะพยายามต่อไป

ขอบคุณพี่ Chaidhanan แล้วก็เว็บบอร์ดดีๆ แบบนี้ สู้ต่อไปทาเคชิ ^^
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-09-24 12:34:49 By : coolkidz
 


 

No. 10



โพสกระทู้ ( 9,586 )
บทความ ( 2 )



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


ตอบความคิดเห็นที่ : 7 เขียนโดย : apisitp เมื่อวันที่ 2014-09-24 09:29:44
รายละเอียดของการตอบ ::
ด้วยความยินดีครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-09-24 17:16:30 By : Chaidhanan
 


 

No. 11



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



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


พี่ 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
 


 

No. 12



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



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


แก้ไขครับ ฐานข้อมูลผิดพลาด จิงแล้ว จะต้องเป็นตามนี้ ผมใส่ bus_id ใน booking_detail ผิด จิงๆต้องเป็น bus_id ที่ 21 ซึ่งเป็นขนาดเล็ก

tb : bus
bs

tb : booking_detail
sgdsdf

สานฝันโปรแกรมมิ่งต่อไป
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-09-25 02:47:46 By : coolkidz
 


 

No. 13



โพสกระทู้ ( 9,586 )
บทความ ( 2 )



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


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
 


 

No. 14



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



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


ครับ เดี่ยวผมจะลองทดสอบ เมื่อคืนวุ่นทั้งคืน ไม่ออก มันออกแต่รถที่จองไปแล้ว T_T
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-09-25 12:15:29 By : coolkidz
 


 

No. 15



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



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


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
 


 

No. 16



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



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


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
 


 

No. 17



โพสกระทู้ ( 9,586 )
บทความ ( 2 )



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


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
 


 

No. 18



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



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


ขอบคุณมากครับ สำหรับความช่วยเหลือ สุดยอดยกนิ้วเลย
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-09-25 23:57:23 By : coolkidz
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : ปรึกษา PHP คำสั่ง MySQL Between หาค่าไอดี 2 ตารางหน่อยครับ
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ 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 05
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 อัตราราคา คลิกที่นี่