MySQL根据同一列的两个不同值查找结果

时间:2017-01-30 00:03:46

标签: mysql

列出拥有49008邮政编码客户和49009邮政编码客户的员工姓名(Ename)。

我正在努力根据上面的表格回答上述问题。

如果表之间的名称匹配则假设约束。

我可以通过左连接和分组轻松过滤以命名和压缩,但在此之后,我不知道正确的位置或声明。我假设它可以通过子查询更好地完成,但不确定。理想情况下,单个查询。

请,谢谢你。

1)为示例数据创建和插入语句:

Create table Employees (EM_Eno INT NOT NULL, EM_Ename VARCHAR(50), EM_Hire_Date DATE, PRIMARY KEY(EM_Eno));

Create table Customers (Customers_Cno INT NOT NULL, Customers_Cname VARCHAR(50), Customers_Street VARCHAR(50), Customers_Zip INT, Customers_Phone INT, primary key(Customers_Cno)); 

Create table Orders (Orders_Ono INT NOT NULL, Orders_Cno INT, Orders_Eno INT, Orders_Received DATE, Orders_Shipped DATE, primary key(Orders_Ono));


insert into Orders values
( 1,301,501,20161010,20161011);
( 2,302,501,20161011,20161012);
( 3,303,502,20161110,20161111);
( 4,304,502,20161110,20161112);
( 5,305,502,20161110,20161113);
( 6,306,503,20161112,20161114);
( 7,307,501,20161112,20161113);
( 8,308,503,20161112,20161115);
( 9,309,503,20161115,20161120);
(10,300,501,20161112,20161113);

insert into Customers values
(300,'Bryan','100 street',49009,1234567890),
(301,'Ryan','101 street',49008,1234567890),
(302,'Nick','102 street',49009,1234567890),
(303,'Nicholas','103 street',49009,1234567890),
(304,'Alexa','104 street',49009,1234567890),
(305,'Tori','105 street',49008,1234567890),
(306,'Scarlet','106 street',49008,1234567890),
(307,'Heather','100 street',49009,1234567890),
(308,'Amanda','107 street',49008,1234567890),
(309,'James','108 street',49008,1234567890);

insert into Employees values
(501,'Robert',20041010),
(502,'Sam',20050110),
(503,'Brandy',20050710);

2)理想的最终结果是回答查询"列出同时拥有49008-zipcode客户和49009-zipcode客户的员工(姓名)。"

3)迄今为止的最佳尝试:

select Employees.EM_Ename
     , Customers.Customers_Zip 
  from Employees 
  left 
  join Orders 
    on Employees.EM_Eno = Orders.Orders_Eno 
  left 
  join Customers 
    on Orders.Orders_Cno = Customers.Customers_Cno 
 group 
    by Employees.EM_Ename
     , Customers.Customers_Zip;

2 个答案:

答案 0 :(得分:0)

这应该是你想要的:

select Min(e.Ename)
from #Employees e 
join #Orders o on o.Eno = e.Eno
join #Customers c on c.Cno = o.Cno
join #Orders o2 on o2.Eno = e.Eno
join #Customers c2 on c2.Cno = o2.Cno
where o.Ono !=o2.Ono--c.Cno != c2.Cno and 
and c.Zip = 49008 and c2.Zip = 49009
group by e.Ename,c.Zip
order by e.Ename

正如您所看到的,如果您想要超过这两个,那么自连接会变得更长。

答案 1 :(得分:0)

在rextest中,表名略有改变,因为其他表已经存在同名...

SELECT e.*
  FROM tbl_employees e
  JOIN tbl_orders o
    ON o.orders_eno = e.em_eno
  JOIN tbl_customers c
    ON c.Customers_Cno = o.Orders_Cno
 WHERE c.Customers_Zip IN(49008,49009)
 GROUP
    BY e.em_eno
HAVING COUNT(DISTINCT customers_zip) = 2;

http://rextester.com/HCNLU51847