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 и все остальные, но только для элементов, имеющих соответствующий тег. В основе лежит теория.

Другие вопросы по тегам