Mysql
LEFT JOIN 不加入第二個表
我在 MariaDB 上執行的 SQL 命令有問題。
我有以下表格:
預訂:
使用者:
我正在嘗試通過
reservations.user_id
和users.id
using加入這些表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.name
,users.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;