SQL-запрос к двум таблицам - PullRequest
1 голос
/ 11 марта 2010

У меня есть две таблицы в БД MySql:

товар

  • id (символ)
  • имя (варчар)
  • описание (varchar)
  • updated_at (datetime)

папка

  • id (int)
  • name (varchar)
  • parent_id (int)

Из запроса по поисковому индексу я получаю упорядоченный список идентификаторов для элементов и папок, которые соответствуют запросу. Например, ("ph76gjd", 34, "rh75ghd", "gr45gfd"). Конечно, в большинстве случаев набор будет намного больше, чем этот. У меня также есть список столбцов, которые мне нужны в наборе результатов, и некоторые из этих столбцов могут отсутствовать в обеих таблицах. Например, ("id", "name", "ified_at ").

Я ищу способ эффективного построения результирующего набора путем запроса к БД.

  • Мне нужно сделать два отдельных запросы, так как я хочу данные из двух разные таблицы? Если так, то я буду нужно привести результаты в порядок как-то?
  • Есть ли способ сделать это с один запрос с использованием объединения или объединения?

Я использую Ruby on Rails, но я не думаю, что язык программирования здесь действительно важен, так как я надеюсь сделать это в основном на SQL. Любая помощь приветствуется.

Обновление

Спасибо за ответы, но, думаю, я не достаточно ясно. Таблицы не имеют отношения к этой проблеме. У меня есть массив идентификаторов строк, которые я хочу, в том порядке, в котором они должны отображаться, и все, что я хочу, это извлечь дополнительные данные столбца из БД.

Ответы [ 3 ]

3 голосов
/ 11 марта 2010

Вы можете получить желаемый результат, используя комбинацию UNION, FIELD и select_rows.

#ids is an array of id's
results = Items.connection.select_rows("
  SELECT A.id, A.name, A.description, A.modified_at, NULL AS parent_id
  FROM   items A
  WHERE  A.id IN (#{ids.join(',')})

  UNION

  SELECT B.id, B.name, NULL AS description, NULL AS modified_at, B.parent_id
  FROM   folders B
  WHERE  A.id IN (#{ids.join(',')})
  ORDER  BY FIELD(id, #{ids.join(','))
")

Результат упорядочен по порядку идентификаторов. Это работает для MySQL.

1 голос
/ 11 марта 2010

как насчет того, чтобы попробовать следующее ...

выберите f.id, f.name, i.id, i.name, i.modified_date от предметов, которые я оставил объединить папки f на i.id = f.parent_id заказ по i.modified_date

надеюсь, это поможет,

Santi! :)

0 голосов
/ 11 марта 2010

Из вашего описания не очевидно, как связаны две таблицы.

Для меня это звучит как отношение «один ко многим» (например, папка имеет один или несколько элементов; элемент принадлежит только одной папке), но обычно это означает отношение внешнего ключа между двумя таблицами:

create table folder
(
    id int not null auto increment,
    name varchar(80) not null,
    primary key(id)
);

create table item
(
    id int not null auto increment,
    name varchar(80) not null,
    folder_id int,
    modified date,
    primary key(id),
    foreign key folder_id references table folder(id)
);

Вы бы запросили следующее:

select folder.id, folder.name, item.id, item.name, item.modified_date
from folder, item
where folder.id = item.folder_id
order by item.modified_date desc;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...