2017-01-30 1 views
0

Liste Mitarbeiter Namen (Ename), die sowohl 49008 Postleitzahl Kunden und 49009 Postleitzahl Kunden haben.MySQL Ergebnisse finden basierend auf zwei verschiedenen Werten der gleichen Spalte

Ich habe Mühe, die obige Abfrage basierend auf den obigen Tabellen zu beantworten.

Wenn die Namen zwischen den Tabellen übereinstimmen, wird die Einschränkung angenommen.

Ich kann filtern, um Namen und zip einfach durch Links Joins und Gruppen von, aber kämpfen danach, ich weiß nicht, die richtige wo oder mit Aussage. Ich gehe davon aus, dass es durch eine Unterabfrage besser gemacht werden könnte, aber nicht sicher. Idealerweise eine einzelne Abfrage.

Bitte und danke.

1) Erstellen und Anweisungen zum Beispiel Daten einfügen: "Liste Mitarbeiter (Namen), die beide 49008-zipcode Kunden und 49009-zipcode Kunden"

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) Ideal Endergebnis ist die Beantwortung der Abfrage

3) Bester Versuch so weit:

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; 
+0

Vielen Dank für die Anleitung, wie man richtig ersuchen. Ich glaube, ich habe eine klarere Anfrage gestellt. Lass es mich wissen, wenn es noch unklar ist. –

+0

wo ist ein Filter für Werte gegen Rowset-Returns, hat ist ein Filter für Gruppen gegen Spalten. – Edward

Antwort

0

Die Tabellennamen leicht im rextest geändert werden, weil andere Tabellen existieren bereits dort mit dem gleichen Namen ...

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

0

Dies sollte sein, was Sie wollen:

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 

Wie Sie sehen können, wenn Sie mehr als diese beiden die Selbst mehr Joins werden wollte.

Verwandte Themen