2015-08-18 2 views
0

У меня есть пара таблиц в базе данных mySQL. Для простоты я буду просто показать некоторые основные поля:mySQL: присоединяйтесь к поиску данных, хотя они существуют

Таблица: источники:

sourceID int not null unique primary key 
trigger int not null 
<other stuff> 

Таблица: sourceBS

id not null unique primary key 
sourceID int not null, 
name varchar(20), 

SourceID в в sourceBS таблица является внешний ключ, ссылающийся на тезку в источниках, с каскадным вариантом. Я протестировал это: если я удалю запись в источниках, соответствующая запись в sourceBS также исчезнет. Хорошо.

Я хочу, чтобы выбрать некоторые вещи из объединения источников и sourceBS, фильтрации на основе свойства «источников». Это должно быть легко, с помощью объединения, которое, я думаю, внешний ключ должен оказывать довольно эффективным, так:

SELECT sources.sourceID, sourceBS.* 
FROM sources 
LEFT JOIN sourceBS ON sources.sourceID = sourceBS.sourceID 
WHERE trigger=1; 

Но когда это работает, каждая строка имеет «NULL» для значений, возвращаемых из sourceBS, даже sourceBS содержит записи, соответствующие условию. Я могу подтвердить это:

SELECT * 
FROM sourceBS 
WHERE sourceID IN (
    SELECT sourceID 
    FROM sources 
    WHERE trigger=1 
); 

Здесь я получаю правильный набор результатов, то есть ненулевые значения. Но, хотя это работает как доказательство концепции, в реальной жизни это не хорошо, потому что я хочу также вернуть кучу вещей из таблицы «sources», и я не хочу запускать несколько запросов, чтобы получить то, что я хочу.

Возвращаясь к соединению, если я заменил левое соединение внутренним соединением, то результаты не возвращаются. Как бы то ни было, «join» просто не находит совпадений в таблице sourceBS, и все же они присутствуют, как показывает второй запрос.

Почему это происходит? Я знаю, что это соединение имеет отношения 1: M, sourceBS может иметь несколько записей для данной записи в источниках, но это должно быть ОК. Я могу проверить именно этот тип соединения на других БД, и он работает.

+0

Предоставить [SQL Fiddle] (http://sqlfiddle.com), демонстрирующий проблему. –

+0

включают образцы данных, так что проблема может быть повторно воссоздана. – HaveNoDisplayName

+0

Я создал SQL-скрипт, который должен инкапсулировать то, что хочет OP, но проблема не возникает. [См. Здесь] (http://sqlfiddle.com/#!9/6631ae/6) – anothershrubery

ответ

0

ОК, поэтому я решил это - это не проблема транзакций в конце: когда я попробовал его на оригинальной машине, он снова не удался. Это был порядок присоединения. Оказывается, что в моем терминале у меня был «ON» пункта наоборот выше, то есть, я делаю:

... LEFT JOIN sourceBS ON (sourceBS.blockSourceID=sources.sourceID) 

, который возвращает все нули. Если я это сделаю (как в приведенном выше коде, котор я вставил)

... LEFT JOIN sourceBS ON (sources.sourceID=sourceBS.sourceID 

оно работает. Когда я попробовал это второй раз прошлой ночью на новой машине, я использовал вторую формулировку.

Угадайте, что я лучше прочитал о присоединениях, чтобы понять, почему это произошло!

Смежные вопросы