[英]MySQL select data from 3 tables
我有3個MySQL表:
** cities **
------------------
id name
------------------
1 New York
2 Los Angeles
3 San Francisco
...
** companies **
------------------
id name
------------------
1 Company 1 Ltd.
2 Company 2 Ltd.
3 Company 3 Ltd.
...
** city_companies **
-------------------------
id city_id company_id
-------------------------
1 2 3
2 1 2
3 3 3
4 3 2
5 1 1
例如,此查詢:
SELECT a.*, c.*
FROM cities a
INNER JOIN city_companies b ON a.id = b.city_id
INNER JOIN companies c ON b.company_id = c.id
WHERE a.city_id = '1'
該查詢將返回屬於“紐約”的公司的列表(在“ city_companies”表中指定)。 我需要得出相反的結果-不屬於“紐約”的公司列表。
DROP TABLE IF EXISTS cities;
CREATE TABLE cities
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,name VARCHAR(20) NOT NULL UNIQUE
);
INSERT INTO cities VALUES
(1,'New York'),
(2,'Los Angeles'),
(3,'San Francisco');
DROP TABLE IF EXISTS companies;
CREATE TABLE companies
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,name VARCHAR(20) NOT NULL UNIQUE
);
INSERT INTO companies VALUES
(1,'Company 1 Ltd.'),
(2,'Company 2 Ltd.'),
(3,'Company 3 Ltd.');
DROP TABLE IF EXISTS city_companies;
CREATE TABLE city_companies
(city_id INT NOT NULL
,company_id INT NOT NULL
,PRIMARY KEY(city_id,company_id)
);
INSERT INTO city_companies VALUES
(2,3),
(1,2),
(3,3),
(3,2),
(1,1);
SELECT DISTINCT x.*
FROM companies x
JOIN city_companies xy1
ON xy1.company_id = x.id
JOIN cities y
ON y.id = xy1.city_id
LEFT
JOIN city_companies xy2
ON xy2.company_id = xy1.company_id
AND xy2.city_id <> xy1.city_id
LEFT
JOIN cities y2
ON y2.id = xy2.city_id
AND y2.name = 'new york'
WHERE y.name <> 'new york'
AND y2.id IS NULL;
id name
3 Company 3 Ltd.
下面的查詢將為您提供預期的輸出
select * from companies c where not exists (
select 1 from cities inner join city_companies on cities.id = city_companies.city_id inner join companies on companies.id = city_companies.company_id where cities.name
= 'new york' and companies.id = c.id)
嘗試這個:
select *
from cities
left join city_companies on cities.id = city_companies.city_id
left join companies on companies.id = city_companies.company_id
where
cities.name != 'New York';
SELECT companies.name from companies
WHERE companies.name NOT IN
(SELECT companies.name FROM companies
INNER JOIN city_companies ON companies.id = city_companies.company_id
INNER JOIN cities ON city_companies.city_id = cities.id
WHERE cities.name = 'New York');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.