Mysql

LEFT JOIN 不加入第二個表

  • May 16, 2021

我在 MariaDB 上執行的 SQL 命令有問題。

我有以下表格:

預訂

使用者

我正在嘗試通過reservations.user_idusers.idusing加入這些表LEFT JOIN,但是沒有成功。

這是我多次創建和編輯但沒有成功的命令:

SELECT reservations.*, IF(DATE_FORMAT(reservations.time_from, '%Y-%m-%d') = CURDATE(), IF(reservations.user_id IS NULL, TRUE, FALSE), TRUE) AS removable FROM reservations
LEFT JOIN (
   SELECT users.id AS userID, users.name AS name, users.surname AS surname FROM users
) AS users ON reservations.user_id = users.userID
WHERE reservations.time_from >= CURDATE()
ORDER BY reservations.time_from;

然而,這就是我得到的全部:

基本上我得到的第一個表沒有第二個表的數據。

我確實需要包含行,user_id NULL因為它用於確認原因。我錯過了什麼嗎?

這是請求的 dbfiddle:dbfiddle

該列是users.id,但在LEFT JOIN SELECT查詢中我將該列重命名為userID. user_id預留的列是允許 NULL 的列,因為它是為預留分配的使用者。NULL => 尚未分配任何人。

我想要做的是讓員工分配給預訂的所有預訂行和使用者。把它想像成孩子的指定看守。這就是為什麼我需要獲得所有即將到來的預訂資訊,並提供警衛將成為的資訊。

如果user_id不是 NULL,則表應該包含列users.nameusers.surname因為我在連接中選擇它們。這就是我要找的。

在您提供的小提琴中進行了澄清之後,我可以解釋您的問題的唯一另一種方式是您說users即使您加入了表格,您也沒有看到表格的列。那是因為您沒有從列表中的users表中列出任何列SELECT

您可以將users您想要的子查詢中的任何或所有列添加到SELECT列表中,如下所示:

SELECT reservations.*, IF(DATE_FORMAT(reservations.time_from, '%Y-%m-%d') = CURDATE(), IF(reservations.user_id IS NULL, TRUE, FALSE), TRUE) AS removable,
   users.*
FROM reservations
LEFT JOIN (
   SELECT users.id AS userID, users.name AS name, users.surname AS surname FROM users
) AS users ON reservations.user_id = users.userID
WHERE reservations.time_from >= CURDATE()
ORDER BY reservations.time_from; 

請注意,您不應該*SELECT列表中使用,因為這是不好的做法,並且可能會在以後導致依賴性問題,而您應該明確列出您想要的列名。

此外,您似乎有些困惑,因為您使用了子查詢來加入users表,但這不是必需的,您可以像這樣更簡單地重新編寫查詢:

SELECT reservations.*, IF(DATE_FORMAT(reservations.time_from, '%Y-%m-%d') = CURDATE(), IF(reservations.user_id IS NULL, TRUE, FALSE), TRUE) AS removable,
   users.id AS userID, users.name AS name, users.surname AS surname
FROM reservations
LEFT JOIN users
   ON reservations.user_id = users.id
WHERE reservations.time_from >= CURDATE()
ORDER BY reservations.time_from;

引用自:https://dba.stackexchange.com/questions/291509