代码之家  ›  专栏  ›  技术社区  ›  Randy Simon

针对两个表的SQL查询

  •  1
  • Randy Simon  · 技术社区  · 14 年前

    我在一个MySQL数据库中有两个表:

    项目

    • ID(字符)
    • 名称(VARCHAR)
    • 说明(varchar)
    • 修改时间(日期时间)

    文件夹

    • ID(int)
    • 名称(VARCHAR)
    • 帕伦特(int)

    通过对搜索索引的查询,我得到了与查询匹配的项目和文件夹的ID的有序列表。例如,“(ph76gjd”,34,“rh75ghd”,“gr45gfd”)。当然,在大多数情况下,集合会比这个大得多。我在结果集中也有一个我想要的列表列,其中一些列可能不存在于这两个表中。例如(“id”、“name”、“modified\u at”)。

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

    • 我需要分开两个吗 查询,因为我需要两个 不同的桌子?如果是的话,我会的 需要把结果整理好 不知何故?
    • 有没有办法用 使用联合或联接的单个查询?

    我在Rails上使用Ruby,但我不认为编程语言是真正的因素,因为我希望主要用SQL来实现这一点。感谢您的帮助。

    更新

    谢谢你的回答,但我想我还不够清楚。就这个问题而言,这些表是无关的。我有一个按行的显示顺序排列的ID数组,我只需要从数据库中提取额外的列数据。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Harish Shetty    14 年前

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

        2
  •  1
  •   san983    14 年前

    试试下面的怎么样…

    选择f.id、f.name、i.id、i.name, i.修改了我留下的物品的日期 在i.id=f.parent_id上加入文件夹f 按I.修改日期订购

    希望它有帮助,

    桑蒂!:)

        3
  •  0
  •   duffymo    14 年前

    从您的描述来看,这两个表之间的关系并不明显。

    对我来说,这听起来像一对多关系(例如,一个文件夹有一个或多个项目;一个项目只属于一个文件夹),但这通常意味着两个表之间的外键关系:

    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;