join或union-in-5 tables-on-date子句

rslzwgfq  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(354)

我的客户有一个数据库,里面有5个表,现在没有关系,只是每个表中的日期。我知道这些可能是不可能的,但我的客户需要一个报告与此表中的信息。他需要加入行列 profession 现在在5个表中的4个表中 amount 以及 userId 在最后一个,所有这些 between 日期。所以我试过了 INNER JOIN 把所有的table都放进去 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 } ?>

我尝试使用日期行,因为客户机只保存一次 amountDATES table。当天他(客户),只在专业行存了一次,在哪个表里?这取决于客户端对用户做了什么(程序有多种形式)

vcudknz3

vcudknz31#

使用 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);

相关问题