我的客户端有一个数据库,里面有5个表,现在没有关系,只是每个表中的日期。我知道这些可能是不可能的,但我的客户需要一份包含此表中信息的报告。他需要加入行profession
,该行现在位于5个表中的4个表中,其中amount
和userId
位于最后一个表中,所有这些都带有between
个日期。所以我尝试了INNER JOIN
所有表,并在ON
子句中与date
行建立了关系。
以下是表格:
---DATES---
userId ---- Int
username -- varchar 150
amount ---- Float(5,2)
date ------ DATETIME
--- TABLE1, TABLE2, TABLE3, TABLE4 --- (same rows for different parts in the program)(have more rows than those)
profession --- varchar 100
date -------- DATETIME
userId ------ Int
我制作了这种类型的INNER JOIN
,但是现在,没有显示任何响应,在控制台中没有任何错误。所以我不知道是否还有其他表格可以告诉我客户需要的信息:
<?php
$fromdate = filter_var($_POST["fromdate"], FILTER_SANITIZE_STRING);
$todate = filter_var($_POST["todate"], FILTER_SANITIZE_STRING);
try{
$sql = $conn->prepare("SELECT DATE_FORMAT(C.date, '%d de %M de %Y') AS date,
C.userId, C.username, C.amount, (D.profession) AS diag1, (DN.profession) AS diag2,
(X.professions) AS diag3, (DJ.profession) AS diag4 FROM DATES C,
INNER JOIN DIAGNOSTICO D
INNER JOIN DIAGNOSTICON DN
INNER JOIN CONSULTA X
INNER JOIN DIAGNOSTICOJUR DJ
ON DATE_FORMAT(C.date, '%Y-%m-%d') = DATE_FORMAT(D.date, '%Y-%m-%d')
AND DATE_FORMAT(C.date, '%Y-%m-%d') = DATE_FORMAT(DN.date, '%Y-%m-%d')
AND DATE_FORMAT(C.date, '%Y-%m-%d') = DATE_FORMAT(X.date, '%Y-%m-%d')
AND DATE_FORMAT(C.date, '%Y-%m-%d') = DATE_FORMAT(DJ.date, '%Y-%m-%d')
WHERE C.date BETWEEN '".$fromdate."' AND '".$todate."' ORDER BY C.date ASC");
$sql->execute();
while($row = $sql->fetch(PDO::FETCH_ASSOC)) {
?>
<tr>
<td><?php echo $row["date"]; ?></td>
<td class="center"><?php echo $row["userId"]; ?></td>
<td class="center"><?php echo $row["username"]; ?></td>
<td class="center"><?php echo $row["amount"]; ?></td>
<td class="center">
<?php echo $row["diag1"].''.$row["diag2"].''.$row["diag3"].''.$row["diag4"]; ?>'
</td> //
</tr>
<?php } ?>
我尝试使用日期行,因为客户端只保存amount
表中的DATES
一次。那天他(客户),只在行业中保存一次,在哪个表中?这取决于客户对用户所做的事情。(该程序有多种形式)
答案 0 :(得分:0)
使用LEFT JOIN
而不是INNER JOIN
,因此您将获得日期行,即使他们在其他表中没有匹配也是如此。
您需要为每个联接使用单独的ON
子句,以指定该特定关系。如果其中一个表缺少特定日期的数据,那么您将获得该表中列的NULL
。
由于您正在使用PDO,因此您应该使用bindParam()
而不是将变量替换为查询。
,
之后你还有一个额外的FROM DATES C
,导致语法错误。
并使用DATE(columnname)
而不是DATE_FORMAT()
。
$sql = $conn->prepare("SELECT DATE_FORMAT(C.date, '%d de %M de %Y') AS date,
C.userId, C.username, C.amount, (D.profession) AS diag1, (DN.profession) AS diag2,
(X.professions) AS diag3, (DJ.profession) AS diag4
FROM DATES C
LEFT JOIN DIAGNOSTICO D ON DATE(C.date) = DATE(D.date)
LEFT JOIN DIAGNOSTICON DN ON DATE(C.date) = DATE(DN.date)
LEFT JOIN CONSULTA X ON DATE(C.date) = DATE(X.date)
LEFT JOIN DIAGNOSTICOJUR DJ ON DATE(C.date) = DATE(DJ.date)
WHERE C.date BETWEEN :fromdate AND :todate ORDER BY C.date ASC");
$sql->bindParam(':fromdate', $fromdate);
$sql->bindParam(':todate', $todate);