我在MySQL DB中有几个表
EID Name
1 Title A
2 Title B
3 Title C
LID EID Location Address Order
1 1 Office NY 1
2 1 Home IL 2
3 2 Office CA 1
4 3 Home NJ 2
我有以上2个表(员工和位置)。我想知道每个员工的位置,办公室作为首选,如果“办公室”不存在,则需要“家”位置。订单栏定义了所需内容的顺序/优先级。
这是需要的输出
EID LID Name Location Address
1 1 Title A Office NY
2 3 Title B Office CA
3 4 Title C Home NJ
答案 0 :(得分:1)
以下查询的第一次加入只会连接Employee
和Location
表格,但请注意,这会导致Location
加入所有记录。以下查询的关键部分是子查询的第二个INNER JOIN
。此子查询标识每个员工ID的最小(即最高优先级)顺序。然后,这将用于丢弃第一个连接中不是最高优先级的记录。
SELECT t1.EID,
t2.LID,
t1.Name,
t2.Location,
t2.Address
FROM Employee t1
INNER JOIN Location t2
ON t1.EID = t2.EID
INNER JOIN
(
SELECT EID, MIN(`Order`) AS min_order
FROM Location
GROUP BY EID
) t3
ON t2.EID = t3.EID AND
t2.Order = t3.min_order
另一个注意事项:不要命名列Order
,这是一个MySQL关键字。为了让我的查询起作用,我不得不把它放在反引号中,至少可以说是不方便,而且可能容易出错。
在这里演示:
答案 1 :(得分:1)
获得结果有两种可能性 1)如果您需要基于订单结果,请使用此查询
SELECT e1.EID,l1.LID,e1.Name,l1.Location,l1.Address
FROM Employee e1 JOIN
(SELECT MIN(
{订单{1}}
2)如果您需要结果基于EID,请使用此查询
)as Minorder,EID,LID,Location,Address,Order
FROM Location
l1 GROUP BY EID)l1
ON l1.EID = e1.EID AND l1.Minorder = l1.Order;
{EID {1}} {订单{1}}
额外注意: -
请使用mysql内置关键字作为列名或表名以获取更多信息阅读此链接click here
答案 2 :(得分:0)
您可以使用内部联接
获得预期结果Select a.eid,b.Lid,a.name,b.location,b.address from Table1 a innner join (select * from Tableb group by eid) b on
a.eid=b.eid;
答案 3 :(得分:0)
你可以试试这段代码,这会对你有帮助,因为我认为
select E.EID,E.name,ad.LID,ad.LOCATION,ad.ADDRESS,ad.[order]
from @emp E inner join @address ad on E.EID = ad.EID
inner join (select EID, min([order]) [order]
from @address
group by EID) tt on ad.EID = tt.EIDand ad.[order] = tt.[order]