รบกวนดูโค้ดให้หน่อยครับ ทำแล้วมันไม่แสดงผล ตามที่ต้องการ
ข้อมูลยังน้อยเกินไปครับ ลองอธิบายพวกโครงสร้าง Table ด้วยครับ
Date :
2013-04-18 10:38:13
By :
mr.win
การ JOIN ตารางแบบไม่มี WHERE ฟิลด์ที่สัมพันธ์กัน
และไม่ได้ GROUP by เรคอร์ดที่ซ้ำกัน ข้อมูลคงจะออกมาหมดนั่นแหละครับ
คงต้องเริ่งจากโครงสร้างว่าตารางไหนเก็บอะไร และสัมพันธ์กับตารางอะไรบ้าง
ภาพเล็กเกินไป มองไม่ออกครับ
Date :
2013-04-18 13:23:49
By :
Naizan
ผมสร้าง ตารางเก็บข้อมูล 4 ตาราง ทั้ง 4 ตารางมีฟิลด์ที่เหมือนกันๆ คือ id,name,day,date แล้วผมก็สร้าง ฟอร์มการรับข้อมูลมา 4 ฟอร์ม
แบบว่า ฟอร์ม1 ใช้ตารางที่1
บันทึกข้อมูลเข้าแล้ว ก็สามารถเรียกดูข้อมูลได้ ตามภาพ
คราวนี้ ผมต้องการที่จะถึงข้อมูลของ 4 ตารางออกมา ก็เลยสร้างอีกฟอร์ม1 ใช้ในการดึงข้อมูลออกมาโชว์ ผมต้องการให้ แสดงผลเวลาของ 4 ช่่วงเวลาให้มาอยุ่ใน ตารางเดียวกัน ของแต่ละคน
แต่นี้ ออกมาเยอะมาก
Date :
2013-04-18 15:14:19
By :
tan
ดูจากข้อมูล ฟิลด์ที่ใช้เชื่อมกันระหว่าง 4 ตาราง มีอยู่ 2 ฟิลด์ครับ
คือ
1. ฟิลด์วันที่ => GROUP by
2. ชื่อ => JOIN
เวลา JOIN ตารางต้องใส่เงื่อนไขนี้เข้าไปใน WHERE
$sql = "SELECT tb_time.name, tb_time.day, tb_time.date, tb_time1.date1, tb_time2.date2, tb_time3.date3 ";
$sql .= "FROM tb_time, tb_time1, tb_time2, tb_time3 ";
$sql .= "WHERE tb_time.name = tb_time1.name AND tb_time.name = tb_time2.name AND tb_time.name = tb_time3.name";
$sql .= "GROUP by tb_time.day";
$sql .= "ORDER by name ";
ไม่มีข้อมูลทดสอบเลยไม่ค่อยแน่ใจ หากไม่มีข้อมูลแสดงออกมาเลย ให้ลองเปลี่ยนเป็น
ตัด WHERE ออก แล้วไปเพิ่ม GROUP by แทน
Code (PHP)
$sql = "SELECT tb_time.name, tb_time.day, tb_time.date, tb_time1.date1, tb_time2.date2, tb_time3.date3 ";
$sql .= "FROM tb_time, tb_time1, tb_time2, tb_time3 ";
$sql .= "GROUP by tb_time.day,tb_time.name ";
$sql .= "ORDER by name ";
ประวัติการแก้ไข 2013-04-18 16:53:53
Date :
2013-04-18 16:52:06
By :
Naizan
ลองใส่โค้ดแล้ว เวลาที่บันทึกคนเดียว มานก็ขึ้นข้อมูลถูกต้อง แต่ใส่คนที่ 2 ที่ 3 เข้าไป 3 ตารางสุดท้าย ดึงข้อมูลของคนสุดท้ายมาใส่ ไม่รู้ว่า เป็นอะไร
Date :
2013-04-18 18:37:56
By :
littlelove
เปลี่ยนเป็นใช้ Syntax ของการเชื่อมตารางเป็นแบบ LEFT JOIN นะครับ
Code (SQL)
SELECT tb_time.name, tb_time.day, tb_time.date, tb_time1.date1, tb_time2.date2, tb_time3.date3
FROM tb_time
LEFT JOIN tb_time1 ON tb_time.name = tb_time1.name1
LEFT JOIN tb_time2 ON tb_time.name = tb_time2.name2
LEFT JOIN tb_time3 ON tb_time.name = tb_time3.name3
GROUP BY tb_time.day, tb_time.name
ORDER BY tb_time.day, tb_time.name
Date :
2013-04-20 10:57:39
By :
Naizan
พี่ครับ จากตารางเดิม ลองไปหาโค้ดมาทำเอง แต่อยากให้รันทุกวัน เป็นการแสดงผลวันต่อวันอ่ะครับ
Code (PHP)
<?php
include "connect.php";
$sql=" SELECT date1 from tb_time1 ";
$result=mysql_db_query($dbname,$sql);
while($record=mysql_fetch_array($result)) {
$date1 = $record[date1];
}
//echo "$date1</br>";
$sql=" SELECT date2 from tb_time2 ";
$result=mysql_db_query($dbname,$sql);
while($record=mysql_fetch_array($result)) {
$date2 = $record[date2];
}
//echo "$date2</br>";
$dif = strtotime($date2) - strtotime($date1);
class Duration1
{
function toString ($duration, $periods = null)
{
if (!is_array($duration)) {
$duration = Duration1::int2array($duration, $periods);
}
return Duration1::array2string($duration);
}
function int2array ($seconds, $periods = null)
{
// Define time periods
if (!is_array($periods)) {
$periods = array (
'years' => 31556926,
'months' => 2629743,
'weeks' => 604800,
'days' => 86400,
'hours' => 3600,
'minutes' => 60,
'seconds' => 1
);
}
$seconds = (float) $seconds;
foreach ($periods as $period => $value) {
$count = floor($seconds / $value);
if ($count == 0) {
continue;
}
$values[$period] = $count;
$seconds = $seconds % $value;
}
if (empty($values)) {
$values = null;
}
return $values;
}
function array2string ($duration)
{
if (!is_array($duration)) {
return false;
}
foreach ($duration as $key => $value) {
$segment_name = substr($key, 0, -1);
$segment = $value . ' ' . $segment_name;
// Plural
if ($value != 1) {
$segment .= 's';
}
$array[] = $segment;
}
$str = implode(', ', $array);
return $str;
}
}
// Convert to a string
echo"มาทำงานตอนเที่ยง ช้าเป็นเวลา " ;
echo Duration1::toString($dif);
?>
Date :
2013-04-25 17:53:16
By :
littlelove
การดึงข้อมูล tb_time1 กับ tb_time2 มาเปรียบเทียบกัน
$dif = strtotime($date2) - strtotime($date1);
มันเป็น $dif = เวลาเข้างานตอนบ่าย - เวลาออกงานตอนเช้า
ค่าที่ได้ มันจะกลายเป็นว่าใช้เวลา "พักเที่ยง" เท่าไหร่
การที่จะหาว่ามาทำงานตอนเช้า ช้าไปเท่าไหร่ เราต้องสร้างตัวแปรขึ้นมาเก็บเวลาเข้างานตอนเช้าก่อนครับ
แนะนำให้สร้างในไฟล์ config.php เพื่อเรียกใช้ได้หลายๆที่ เช่น
$startTimeMorning = "08:00:00";
ถ้าอยากทราบว่ามาสายเท่าไหร่ ก็เอาเวลาที่เข้างานเช้า ลบกับเวลาเข้างานที่บริษัทกำหนด ก็จะได้
$dif = strtotime($date1) - strtotime($startTimeMorning );
ส่วนเข้างานตอนบ่าย ก็สร้างตัวแปรเก็บค่า เช่น บริษัทกำหนดให้เข้างานที่บ่ายโมง
$startTimeAfternoon = "13:00:00";
และต้องการทราบว่าตอนบ่ายมาสายเท่าไหร่ ก็เอาเวลาที่เข้างานบ่าย ลบกับเวลาเข้างานที่บริษัทกำหนด ก็จะได้
$dif2 = strtotime($date2) - strtotime($startTimeAfternoon );
ลองแก้ดูนะครับ
Date :
2013-04-26 06:09:50
By :
Naizan
ขอบคุณครับ ที่ให้ความช่วยเหลือ
Date :
2013-04-26 16:20:42
By :
littlelove
พี่ครับ อยากได้ โค้ด เอาเวลามาสาย ตอนเช้า บวกกับ มาสาย ตอนบ่าย ทำไงอ่ะ ลองทำแล้วมันไม่ได้ มันเอา นาที กับ วินาทีเลย
Date :
2013-04-30 17:55:02
By :
littlelove
Load balance : Server 05