mysql - 使用 DATE 子句连接或联合 5 个表

标签 mysql join inner-join union

我的客户有一个数据库,里面有 5 个表,现在没有关系,每个表中只有日期。我知道这些可能是不可能的,但我的客户需要一份包含此表中信息的报告。他需要将当前位于 5 个表中的 4 个表中的行 profession 与最后一个表中的 amountuserId 连接起来,所有这些都带有 日期之间。因此,我尝试 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 } ?>

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

最佳答案

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

关于mysql - 使用 DATE 子句连接或联合 5 个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50070932/

相关文章:

mysql - 通过以下方式获取每组的前/后 n 条记录

php - 如何将带有空格的文本从Android发送到MySQL数据库

php - 将 MySQL 结构导入实时 SQL 数据库

php - 试图在数据库中存储多个值,但我的表单只注册一个(通过复选框)

mysql - 按日期范围历史生成完整类别结构

MySQL 使用 pivot 从多个表中选择

php - 这个简单的 UPDATE 查询不会工作

sql - 如何在单个 SQL 语句中查询两次 postgresql 表

mysql - 插入mysql日期范围,每7天添加不同的值(轮类日历)

mysql - 使用 2 个连接创建 View 时出现问题