如何从多个表进行自定义查询

时间:2013-10-24 08:37:27

标签: mysql sql left-join

我们有3个不同的表格 即。用户,daily_status,status_types

表中的

字段

用户:

id,
name,
department_id
用户表的

数据:

u1 jai 1
u2 singh 1
u3 test 2

daily_status:

id,
user_id,
status_id,
date

daily_status表的数据:

1 u1 2 '23/10/2013'
2 u1 3 '24/10/2013'
3 u2 3 '23/10/2013'
4 u3 2 '23/10/2013'
5 u3 2 '23/10/2013'

status_types:

id,
status_name,

status_types表的数据

1 present
2 leave
3 sick

我需要像这样进行查询

SELECT user.id, user.name status.name 
LEFT JOIN daily_status as ds ON (user.id=ds.user_id)
LEFT JOIN status_types as status ON (ds.status_id=status.id)
WHERE user.department_id=1 AND ds.date='24/10/2013'

目前的结果:

u1 jai sick

但我想要

u1 jai sick
u2 singh -

根据查询结果很好,但是我需要重新配置它,以便它为我提供该部门所有用户的详细信息,这些用户在daily_status表中没有该日期的状态。

4 个答案:

答案 0 :(得分:0)

将日期验证移至ON:

SELECT u.id, u.name, status.status_name 
FROM user u
LEFT JOIN daily_status as ds ON u.id=ds.user_id AND ds.date='24/10/2013'
LEFT JOIN status_types as status ON ds.status_id=status.id
WHERE u.department_id=1

sqlfiddle demo

答案 1 :(得分:0)

如果你做一个OUTER JOIN并把一个WHERE somethingFromMyLeftJoinedTable =“something”,你将只得到LEFT JOINed表中存在“something”的结果。

要解决此问题,您可以将WHERE date ='xxx'移动到查询的JOIN部分,如下所示

SELECT user.id, user.name status.name 
LEFT JOIN daily_status as ds ON user.id=ds.user_id AND ds.date = '24/10/2013'
LEFT JOIN status_types as status ON (ds.status_id=status.id)
WHERE user.department_id=1

希望这有帮助。

答案 2 :(得分:0)

试试这个

 SELECT user.id, user.name status.name 
 from user
 LEFT JOIN daily_status as ds ON (user.id=ds.user_id AND ds.date='24/10/2013')
 LEFT JOIN status_types as status ON (ds.status_id=status.id)
 WHERE user.department_id=1 and ds.id is null

或试试这个

 SELECT user.id, user.name ,'' as  statusname 
 from user
where user.id not in 
(select ds.user_id from 
daily_status as ds 
LEFT JOIN status_types as status ON (ds.status_id=status.id)
WHERE user.department_id=1 and ds.date = '24/10/2013')

答案 3 :(得分:0)

也许我过度简化了这一点,但你只有一条记录具有给定日期24/10/2013所以只有一个可以显示。

如果您在某个特定日期拥有多个商家信息,则可以执行此类操作

SELECT a.id,a.[name],status_types.status_name FROM(SELECT id,[user].[name],department_id,ROW_NUMBER()OVER(PARTITION BY[user].[name]ORDER BY ID DESC)rn FROM[user])a LEFT JOIN daily_status AS ds ON(a.id=ds.user_id)LEFT JOIN status_types ON(ds.status_id=status_types.id)WHERE a.department_id=1AND rn=1AND ds.date='2013-10-23'