簡體   English   中英

MySQL根據同一列的兩個不同值查找結果

[英]MySQL find results based on two different values of the same column

列出同時擁有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個郵政編碼客戶和49009個郵政編碼客戶的員工(姓名)”。

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;

這應該是您想要的:

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

如您所見,如果您想要的比這兩個更多,那么自我聯接會變得更長。

在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

暫無
暫無

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

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