2010-03-11 4 views
1

у меня есть две таблицы в БД MySQL:SQL запрос к двум таблицам

элементы

  • идентификатор (голец)
  • имя (VARCHAR)
  • описание (VARCHAR)
  • modified_at (datetime)

папки

  • идентификатор (целое)
  • имя (VARCHAR)
  • parent_id (интермедиат)

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

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

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

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

Update

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

ответ

3

Вы можете получить необходимый результат, используя комбинацию из 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(',')) 
") 

Результаты заказаны по заказу id. Это работает для MySQL.

+0

NULL AS ... это то, чего я не хватало. Это выглядит хорошо, за исключением того, что набор результатов не в том же порядке, что и идентификаторы. –

+0

Добавлен заказ. –

+0

Но это будет упорядочиваться по id (в алфавитном порядке), а не по порядку массива «ids», используемого в предложении where. –

0

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

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

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; 
+0

Фактически, таблицы по существу не связаны. Я выбираю на основе набора идентификаторов, а не какой-либо связи между таблицами. –

1

, что о попытке следующее ...

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

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

Santi! :)

+0

Спасибо, но есть несколько проблем с этим ответом. Во-первых, i.id = f.parent_id не является допустимым ограничением. Как я сказал выше, вы можете представить эти две таблицы как полностью не связанные. Во-вторых, это игнорирует, что у меня есть список идентификаторов, которые я хочу быть моим ограничением запросов (фильтр «IN»), и я хочу, чтобы порядок был порядком этих идентификаторов. –

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