Mysql получение всех объединенных записей обеих таблиц
Я использую отличный php-фреймворк для работы с моей базой данных, medoo.php. Ссылка на документы Medoo для справки: http://medoo.in/doc
Что я хочу, чтобы произошло:
- Вернуть все записи из объединенных таблиц, где это соответствует одному или нескольким условиям из правой таблицы. (основная таблица - "предметы")
- Включает в себя соответствующие / объединенные записи из правой таблицы. (в этом случае возвращаются все теги, связанные с элементами).
Что происходит в настоящее время:
- Возвращает записи из левой таблицы (элементы), объединенные с правой таблицей (теги). Однако он только возвращает записи, явно содержащие теги, из условия WHERE. Я хочу, чтобы все теги были присоединены к элементам для элементов, теги которых соответствуют условию WHERE.
Давайте немного кода, чтобы лучше проиллюстрировать проблему:
//example 'items' table
id - 123
name - 'test'
desc - 'testing'
//example 'tags' table
id - 100
name - 'tag1'
//example 'taglist' table (relational)
id - 10
itemid - 123
tagid - 100
Это иллюстрирует базовую настройку, немного уменьшенную для ясности.
Затем, используя medoo, я выбираю из 'items' и соединяю теги /taglist с левыми соединениями (в настоящее время). Предложение WHERE: tag.id соответствует опубликованному тегу для поиска. Также попробовал taglist.tagid в ГДЕ.
Возвращенные результаты относятся ко всем "элементам", которые содержат теги, соответствующие предложению WHERE, как и следовало ожидать. Тем не менее, я хочу, чтобы все теги, которые идут с этими элементами, а не только теги, которые я искал (что я и получаю).
Я думаю, что это должно быть как-то связано с предложением JOINs или WHERE, но я должен сказать, что я потерян после нескольких часов попыток, исследований и новых попыток. Надеясь, что кто-то может помочь мне быстро определить, где я, вероятно, допустил ошибку в моей логике.
Для дальнейшего ознакомления, вот полная настройка запроса, используя medoo.
//setup query
$table = 'items';
$join = [
"[>]taglist(tl)" => ["id" => "itemid"],
"[>]filelist(fl)" => ["id" => "itemid"],
"[>]tags(t)" => ["tl.tagid" => "id"],
"[>]files(f)" => ["fl.fileid" => "id"]
];
$cols = [
"items.id(id)",
"items.itemid(itemid)",
"items.name(name)",
"items.def(def)",
"items.class(class)",
"items.timeline(timeline)",
"t.id(tagid)",
"t.name(tagname)",
"f.id(fileid)",
"f.name(filename)",
"f.path(filepath)",
"f.type(filetype)",
"tl.tagid"
];
$where = [
"AND" => ["tl.tagid" => $tags],
"ORDER" => ["items.id DESC","t.name ASC"],
"LIMIT" => [$start,$limit]
];
// Do query
$results = $db->select($table, $join, $cols, $where);
Если вы не знакомы с medoo, это все равно должно показать, как довольно просто настроить запрос. (Запрос работает просто отлично, я просто не получаю все результаты, которые хочу).
Спасибо за любой совет. На этой неделе я многому учусь!
1 ответ
Если вы делаете leftside LEFT JOIN rightside ON something
а затем сделать WHERE rightside.column = something
вы превращаете левое соединение в прямое соединение.
Прямые СОЕДИНЕНИЯ подавляют ряды из leftside
которые не соответствуют ON
в соединении.
Так что попробуйте избавиться от вашего состояния ГДЕ.
Изменить Я не знаю рамки, которую вы упоминаете.
Но, чтобы получить каждый элемент, имеющий определенный tagid, вы делаете это.
SELECT DISTINCT itemid FROM taglist WHERE tagid = $tags
Тогда вы можете сделать свой основной запрос с
WHERE items.id IN (SELECT DISTINCT itemid FROM taglist WHERE tagid = $tags)
отфильтровать только элементы с соответствующими тегами. Ваш основной запрос будет извлекать все теги, в том числе с tagid = $tags
и все остальные, но только для элементов, имеющих соответствующий тег. В основе лежит теория.