[英]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個,是因為您正在對事務表t1
的employee_id
進行GROUP BY
。 如果將其刪除或將其更改為e.employee_id
,它將返回您需要的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.