Я пытаюсь получить список company_id
, у которого нет заметок на уровне компании. Однако компания может иметь записи на уровне местоположения.MySQL Выберите раздел с левым соединением?
company
-------------------------
company_id name deleted
1 Foo 0
2 Bar 0
3 Baz 0
location
-----------------------
location_id company_id
6 1
7 2
8 3
note
-----------------------------------------
note_id company_id location_id deleted
10 2 6 0 // location-level note
11 1 7 0 // location-level note
12 null 8 0 // location-level note
13 2 null 0 // company-level note
Я хочу, чтобы мой результат стол таким:
company_id name
1 Foo
3 Baz
Update
Foo
/company_id = 1
не имеет на уровне компании к сведению, потому что в записке также имеет location_id
, что делает его записью на уровне местоположения. Примечания на уровне компании - это заметки, которые относятся только к компании (а не к местоположению).
Конец обновления
Я пытался сделать что-то вроде этого, но он возвращает пустой набор, так что я не уверен, если он работает и нет никаких компаний без нот на уровне компании или если я делаю что-то неправильно.
SELECT DISTINCT
c.company_id,
c.name
FROM company AS c
LEFT JOIN note AS n
ON c.company_id = n.company_id
WHERE
c.deleted = 0 AND
n.deleted = 0 AND
n.location_id IS NOT NULL AND
n.location_id != 0 AND
c.company_id = (SELECT MAX(company_id) FROM company)
Пересмотренный Принимается Ответа на этот вопрос Mike
SELECT
company_id,
name
FROM company
WHERE
deleted = 0 AND
company_id NOT IN (
SELECT DISTINCT
c.company_id
FROM company AS c
INNER JOIN note AS n
ON c.company_id = n.company_id
WHERE (
n.deleted = 0 AND
(n.location_id IS NULL OR
n.location_id = 0)
)
);
'Deleted' столбец отсутствует в выборочных данных, и эти условия' n.deleted = 0 И n.location_id IS NOT NULL И n.location_id! = 0' повернет 'Левый join' в' Внутренне join' –
'c.company_id = (SELECT MAX (company_id) FROM company)' это будет гарантировать, что в результате будет только один вопрос 'company_id' –
@Prdp, чтобы включить удаленные столбцы. Как я могу предотвратить превращение Left в Inner Join, а также поиск только заметок на уровне компании? – GreeKatrina