针对两个表的SQL查询

时间:2010-03-11 00:30:28

标签: sql mysql ruby-on-rails

我在MySql DB中有两个表:

  • id(char)
  • name(varchar)
  • description(varchar)
  • modified_at(datetime)

文件夹

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

从针对搜索索引的查询中,我获得了与查询匹配的项目和文件夹的有序ID列表。例如,(“ph76gjd”,34,“rh75ghd”,“gr45gfd”)。当然,在大多数情况下,该集合将远大于此。我在结果集中也有我想要的列表列,并且这些列中的某些列可能不存在于两个表中。例如,(“id”,“name”,“modified_at”)。

我正在寻找一种通过查询数据库来有效构建结果集的方法。

  • 我需要分开两个 查询,因为我想要两个数据 不同的表?如果是这样,那么我会 需要将结果重新整理好 不知何故?
  • 有没有办法用a来做到这一点 使用union或join的单个查询?

我正在使用Ruby on Rails但我不认为编程语言真的是一个因素,因为我希望主要在SQL中这样做。任何帮助表示赞赏。

更新

感谢您的回答,但我想我还不够清楚。就这个问题而言,表格是无关的。我按照它们应该出现的顺序有一系列我想要的行ID,我想要的是从数据库中提取额外的列数据。

3 个答案:

答案 0 :(得分:3)

您可以使用UNIONFIELDselect_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。

答案 1 :(得分:1)

尝试以下内容...

  

选择f.id,f.name,i.id,i.name,   i.modified_date来自我离开的项目   在i.id = f.parent_id上加入文件夹f   按i.modified_date排序

希望它有所帮助,

桑蒂! :)

答案 2 :(得分: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;