Join или Union в 5 таблицах в предложении DATE - PullRequest
0 голосов
/ 28 апреля 2018

У моего клиента есть база данных, а внутри - 5 таблиц, прямо сейчас без связи, только дата в каждой таблице. Я знаю, что это может быть невозможно, но моему клиенту нужен отчет с информацией в этих таблицах. Ему нужно присоединиться к строке profession, которая сейчас находится в 4 из 5 таблиц с 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. В тот же день он (клиент) сохранил в ряду профессий только один раз, в какой таблице? это зависит от того, что клиент сделал с пользователем. (Программа имеет несколько форм)

1 Ответ

0 голосов
/ 28 апреля 2018

Используйте 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...