簡體   English   中英

MySQL左連接似乎不起作用

[英]Mysql left join doesn't seem to work

我正試圖加入兩個表。 第一個表包含員工信息,例如員工編號名稱等。第二個表包含時鍾信息,例如員工編號,狀態(時鍾輸入或輸出),日期時間行的最后更新時間,時鍾輸入時間,時鍾輸出時間,天。

我有這樣的東西,但數據庫中有真實信息

employees_tbl(
   employee_id INT NOT NULL AUTO_INCREMENT,
   employee_first VARCHAR(30) NOT NULL,
   employee_last VARCHAR(30) NOT NULL,
   PRIMARY KEY ( employee_id )
);
insert into employee (employee_id, employee_first, employee_last) values (1, First, Name);
insert into employee (employee_id, employee_first, employee_last) values (2, Second, Name);
insert into employee (employee_id, employee_first, employee_last) values (3, Third, Name);
insert into employee (employee_id, employee_first, employee_last) values (4, Fourth, Name);
insert into employee (employee_id, employee_first, employee_last) values (5, Fifth, Name);

employee number, status(clocked in or out), datetime row was last updated, time clocked in, time clocked out, hours
transactions_tbl(
   employee_id INT NOT NULL
   status VARCHAR(3) NOT NULL,
   datetime DATETIME NOT NULL,
   clockin TIME,
   clockout TIME,
   hours TIME,
   PRIMARY KEY ( employee_id )
);

INSERT INTO transactions (employee_id, status, datetime, clockin, clockout, hours) VALUES (1, "OUT", "2015-08-10 05:00:00", "2015-08-10 04:00:00", "2015-08-10 05:00:00", "01:00:00");
INSERT INTO transactions (employee_id, status, datetime, clockin, clockout, hours) VALUES (2, "IN", "2015-08-11 05:00:00", "2015-08-11 04:00:00", , );
INSERT INTO transactions (employee_id, status, datetime, clockin, clockout, hours) VALUES (3, "IN", "2015-08-11 05:00:00", "2015-08-10 04:00:00", "2015-08-10 05:00:00", "01:00:00");

我正在尋找的輸出是每位員工都應該有他們的名字,並且如果他們在當天的工作時間里已經輸入或輸出,則應該顯示該信息。 如果他們當天沒有上班或下班,它應該只顯示他們上一次上班或下班的時間。 它應始終顯示員工的最新記錄,這意味着最近的活動。 如果他們從未進出過餐廳,則仍應顯示其姓名。

我正在使用的查詢是:

'SELECT employee_id, employee_first FROM employees e left join (SELECT * FROM transactions ORDER BY datetime DESC) as t1 on e.employee_id = t1.employee_id GROUP BY t1.employee_id'

但是它只給我前三名員工,而第四名及以后的員工則一無所有。

我在mysql和php中對此進行編碼。 我會在這里將結果顯示為表格,但無法完全弄清楚如何正確設置表格格式。 一切都陷入了混亂,我什至無法判斷。 但希望您能明白這一點。

這是您的查詢:

SELECT e.employee_id, e.employee_first
FROM employees e left join
     (SELECT * FROM transactions ORDER BY datetime DESC) as t1
     on e.employee_id = t1.employee_id
GROUP BY t1.employee_id;

它有幾個主要錯誤。 首先是在GROUP BY使用t1.employee_id 這是來自第二個表而不是第一個表,因此它可以為NULL 其次,您在子查詢中有一個ORDER BY ,顯然希望這樣做。 我還假設您確實想要t1列。

根據您的描述,我認為您想要:

SELECT e.employee_id, e.employee_first, t.*
FROM employees e left join
     (SELECT employee_id, MAX(datetime) as maxdt
      FROM transactions 
      GROUP BY employee_id
     ) tmax
     on e.employee_id = tmax.employee_id left join
     transactions t
     on tmax.employee_id = t.employee_id and tmax.maxdt = t.datetime;

您正在從Transactions表開始進行左聯接。 它只有3名員工。 您的代碼正常工作。 如果要獲得所有員工,請在事務表上進行正確的聯接。

為什么不只是

SELECT employee_id, employee_first
FROM employees e
LEFT JOIN transactions t1 on e.employee_id = t1.employee_id
GROUP BY t1.employee_id

哦,順便說一句,之所以只能得到3個結果而不是5個,是因為您正在對事務表t1employee_id進行GROUP BY 如果將其刪除或將其更改為e.employee_id ,它將返回您需要的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM