У меня есть пара таблиц в базе данных 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 может иметь несколько записей для данной записи в источниках, но это должно быть ОК. Я могу проверить именно этот тип соединения на других БД, и он работает.
Предоставить [SQL Fiddle] (http://sqlfiddle.com), демонстрирующий проблему. –
включают образцы данных, так что проблема может быть повторно воссоздана. – HaveNoDisplayName
Я создал SQL-скрипт, который должен инкапсулировать то, что хочет OP, но проблема не возникает. [См. Здесь] (http://sqlfiddle.com/#!9/6631ae/6) – anothershrubery