选择SQL查询以从多个表中获取数据并在一个表中查看

时间:2018-02-05 18:02:19

标签: php html mysql sql

上升的问题是,在结账时间数据中雇主键入之前自动循环结账时间。

签入时间后,结帐列将为空,但会自动生成结帐时间,接下来的几天,它会从前几天提取数据并重复时间。我只是怀疑,会有一些错误在一个查询中调用3个表中的数据:   * tbl_student   * 时间   * check_out



Table 1 ( time )

id       id_number1      date1        check_in             
-----------------------------------------------------
30        10001       2018-02-04       22:07:59

31        10002       2018-02-04       22:08:09

32        10001       2018-02-05      08:21:10 




Table 2 ( check_out)

id       id_number2      date2        check_out             
-----------------------------------------------------
10         10001      2018-02-04      22:09:09

11         10002      2018-02-04      22:09:21

12         10001      2018-02-05      09:21:22


Table 3 ( tbl_student )

id       id_number      Password       full_name             
-----------------------------------------------------
2          10001         10001           Alma

3          10002         10002          Daniel




out put



<?php
    include ("connection.php");
	$id = $_GET['employee-ID'];
	$query = "SELECT tbl_student.full_name,tbl_student.Id_Number, time.Id_Number1, time.date1 ,time.check_in, check_out.check_out  
	          FROM tbl_student, time, check_out 
	          WHERE check_out.Id_Number2 ='$id' AND time.Id_Number1 = '$id' AND  tbl_student.Id_Number =  '$id'";
	$result = mysqli_query ($link, $query) or die("select Error ".mysqli_error($link));
	$i = 1;
	while ($row = mysqli_fetch_array($result)) {
		
?>
<tbody>   
    
    <tr>
    <td><?php echo $i; ?></td>
    <td><?php echo $row['full_name']; ?></td>
    <td><?php echo $row['Id_Number']; ?></td>
    <td><?php echo $row['check_in'];  ?></td>
    <td><?php echo $row['check_out']; ?></td>
    </tr>
    <?php
	$i++;
	}
	mysqli_close  ($link);
?>
<p>
</p>
&#13;
&#13;
&#13;

Error

&#13;
&#13;
<?php
    include ("connection.php");
	$id = $_GET['employee-ID'];
	$query = "SELECT tbl_student.full_name, tbl_student.Id_Number, time.Id_Number1, time.date1, time.check_in,check_out.check_out, time.time_rn, check_out.check_out_rn
	
            FROM tbl_student ,(SELECT time.*, row_number() OVER ( partition by time.id_number1 order by time.date1) time_rn FROM time WHERE 1=1 ) 
			
	        time, (SELECT check_out.*, row_number() OVER (partition by check_out.id_number2 order by check_out.date2) check_out_rn from check_out where 1=1) check_out 
   
            WHERE check_out.Id_Number2='$id' AND time.Id_Number1 ='$id' AND tbl_student.Id_Number = '$id' AND time_rn = check_out_rn (+)";
	 
	$result = mysqli_query ($link, $query) or die("select Error ".mysqli_error($link));
	while ($row = mysqli_fetch_array($result)) {
		
?>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

好的,这就是事情。如果您运行查询,您会看到它只是在timecheck_out表之间进行交叉连接笛卡尔加入。你几乎从不想要这个。它显示了check_in和check_out时间的每种可能组合,因为你没有告诉它check_in和check_out时间应该如何相关。

select full_name, id_number, date1, check_in, check_out
from tbl_student, time, check_out
where id_number = 10001 and id_number1 = 10001 and id_number2 = 10001;

FULL_NAME  ID_NUMBER DATE1     CHECK_IN CHECK_OUT
--------- ---------- --------- -------- ---------
Alma           10001 04-FEB-18 22:07:59 22:09:09 
Alma           10001 04-FEB-18 22:07:59 09:21:22 
Alma           10001 05-FEB-18 08:21:10 22:09:09 
Alma           10001 05-FEB-18 08:21:10 09:21:22 

在这种情况下,我假设您希望显示check_out时间,该时间与该用户的check_in时间序列相匹配。因此,用户的第三次登记应该与他们的第三次退房相匹配。为此,我将为每个表添加一个“由id_number分区的row_number”,以便我们可以匹配它们。

SELECT tbl_student.full_name, tbl_student.Id_Number, 
    time.Id_Number1, time.date1, time.check_in,
    check_out.check_out,
        time.time_rn, -- for testing
        check_out.check_out_rn -- for testing
  FROM tbl_student, 
    (select time.*,
        row_number() over (partition by time.id_number1 order by time.date1) time_rn
        from time where 1=1) time, 
    (select check_out.*,
        row_number() over (partition by check_out.id_number2 order by check_out.date2) check_out_rn
        from check_out where 1=1) check_out 
  WHERE check_out.Id_Number2=10001 AND time.Id_Number1 =10001 AND tbl_student.Id_Number = 10001
    and time_rn = check_out_rn (+)
  ;

输出:

FULL_NAME  ID_NUMBER ID_NUMBER1 DATE1     CHECK_IN CHECK_OUT    TIME_RN CHECK_OUT_RN
--------- ---------- ---------- --------- -------- --------- ---------- ------------
Alma           10001      10001 04-FEB-18 22:07:59 22:09:09           1            1
Alma           10001      10001 05-FEB-18 08:21:10 09:21:22           2            2

顺便说一句,这是一种尴尬的表结构。如果您可以更改架构,我建议删除check_out表并执行类似的操作:

create table time (id number, 
                   id_number1 number, 
                   date1 date, 
                   check_in varchar2(8), 
                   check_out varchar2(8));

这样你可以判断某人还没有结账,因为time.check_out将为空。

编辑:看起来你使用的是早于8.0的MySQL版本,它不支持窗口函数。试试这个。在某些方面,这是一个更简单的查询。

SELECT tbl_student.full_name, tbl_student.Id_Number, 
time.Id_Number1, time.date1, time.check_in,
(select min(check_out) 
  from check_out
  where Id_Number2=time.Id_Number1
    and check_out.date2 >= time.date1
    and check_out.check_out >= time.check_in) check_out
FROM tbl_student, time
WHERE time.Id_Number1 =10001 AND tbl_student.Id_Number = 10001;