2015-12-25 4 views
1

У меня есть 2 таблицы, A и B, обе имеют те же данные, что и таблица B также имеет столбец «include».Mysql где (в) инструкция другой таблицы без объединений

Я хочу выбрать все записи a.code и a.user_id в таблице a, если такая же комбинация A.user_id + A.code существует в таблице B, где include равно 1, то я не хочу возвращать эти значения из таблицы А.

Сначала я пытался это исправить с этим:

SELECT a.code, a.user_id 
LEFT JOIN B ON a.code = b.code 
FROM A a WHERE b.include != 1 

это не работает, потому что поле кода существует несколько раз в таблице B, так что я получил много результатов.

В конце концов я придумал это, но я не уверен, что это лучшее решение или даже правильное.

SELECT a.code, a.user_id 
FROM A a WHERE CONCAT(code, '-', user_id) 
IN (SELECT CONCAT(code, '-', user_id) FROM b WHERE include != 1 

Любая помощь очень ценится!

+0

левое соединение не работает – devpro

+0

U нужна запись либо код, доступный в таблице B, либо не – devpro

+0

U имеет несколько записей в таблице B, и им не нужны только одна запись? – devpro

ответ

0

Есть по крайней мере два способа сделать это

За исключением LEFT JOIN:

SELECT a.code, a.user_id 
FROM A a 
LEFT JOIN B 
    ON a.code = b.code 
    AND a.user_id = b.user_id 
    AND b.include = 1 
WHERE b.user_id IS NULL 

Или за исключением подвыборкой

SELECT a.code, a.user_id 
FROM A a 
WHERE NOT EXISTS (
    SELECT 1 
    FROM B b 
    WHERE b.code = a.code 
    AND b.user_id = a.user_id 
    AND b.include = 1 
) 

http://sqlfiddle.com/#!9/e0118c/1

+0

Спасибо! Я думаю, что это то, что я искал, он возвращает больше строк, чем решение, которое у меня было. Не могли бы вы объяснить, почему первый запрос работает с тем, где b.user_id IS NULL? –

+0

Это связано с тем, как работает «LEFT JOIN». Если для строки в таблице 'A' нет такой строки в таблице' B', которая соответствует критериям объединения, все столбцы из таблицы 'B' будут содержать' NULL'. Если вы измените запрос на 'SELECT * ...' без 'WHERE ...', вы увидите нефильтрованный результат 'LEFT JOIN' ([sample] (http://sqlfiddle.com/#!9/ e0118c/5)). Теперь вы можете проверить любой B-coulmn, используемый в состоянии JOIN. Если это «NULL» - это возможно только в том случае, если для данной таблицы 'A' не найдена строка из таблицы' B'. –

0

Попробуйте

SELECT a.code, a.user_id 
LEFT JOIN B ON a.code = b.code AND a.user_id = b.user_id 
FROM A a WHERE b.include != 1 

Это решение равно ваш второй запрос.

+0

Это не работает. Я возвращаю более 2000 результатов, в то время как таблица A содержит только 1700 записей. –