【问题标题】:Mysql query from two tables as parent and child objects从两个表作为父对象和子对象的Mysql查询
【发布时间】:2015-06-16 19:12:24
【问题描述】:

我正在创建一个 Angularjs 应用程序,其中包含两个表“联系人组”和“联系人列表”。联系人列表表项目具有联系人组中项目的对应 ID。 我想要实现的是一个 MySQL/Sqlite 选择查询,它将每个联系人列表项作为其父项的子对象。

contact_group
  id | title 
 ------------
  1  | friends
  2  | mates
  3  | family

contact_list
 id  | gID | name | number
--------------------------
  1  |  1  | dave |0208500
  2  |  1  | dan  |4213839
  3  |  1  | sans |5656434
  4  |  2  | fola |1918982
  5  |  3  | brian|2398343
  6  |  5  | grace|0934232

选择查询结果示例(这是我想要得到的)

id: 1
title: friends
child: {id:1, name:dave, number:0208500}, {id:2, name:dan, number:4213839},{id:3, name:sans, number:5656434}

我认为还有另一种方法,这就是我想要实现的。我从contact_group 标题创建了一个带有标题的手风琴。在每个手风琴下是来自contact_list 的通讯联系人。

如果有人可以帮助我,我会很高兴。谢谢

【问题讨论】:

    标签: mysql sqlite


    【解决方案1】:

    为了实现这一点,您必须使用 MySql GROUP_CONCAT(此处的文档:https://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

    使用GROUP_CONCAT,我们将能够将联系人TB 中的所有匹配行连接成一列中的字符串。通过更多的文本格式,我们将联系人 TB 和CONCAT 的其他用法粘合在一起,我们将在此列中将字符串构建为 JSON 字符串,然后您就可以在您的应用程序上使用它。

    这里是 SQL:

    SELECT
        a.id,
        a.title,
        CONCAT(
          '[',
          GROUP_CONCAT(
              CONCAT(
                  '{"id":',
                  b.id,
                  ', "name":"',
                  b. `name`,
                  '", "number":"',
                  b.number,
                  '"}'
              ) 
              ORDER BY
                  b.`name`
          ), ']')
          AS people
    FROM
        contact_group AS a
    LEFT JOIN contact_list AS b ON a.id = b.gID
    GROUP BY
        a.id,
        a.title
    

    这是我们将得到的结果:

    别忘了给你的表添加索引和外键,这样查询处理会更好。

    SQLLITE 版本: 为了将查询调整为 sqllite,有 2 个特性需要更改。 SqlLite 使用|| 运算符而不是CONCAT,它不支持GROUP_CONCAT 内的ORDER BY。因此对于 SQLLITE DB,查询将如下所示:

    SELECT
        a.id,
        a.title,
        '[' ||
          GROUP_CONCAT(
                '{"id":' ||
                  b.id ||
                  ', "name":"' ||
                  b. `name` ||
                  '", "number":"' ||
                  b.number ||
                  '"}'
    
    
          ) || ']'
          AS people
    FROM
        contact_group AS a
    LEFT JOIN contact_list AS b ON a.id = b.gID
    GROUP BY
        a.id,
        a.title
    

    MySQL Fiddle Demo

    SqlLite Fiddle Demo

    【讨论】:

    • 谢谢@Lupin 请你把这个查询写成sqlite(websql)。我遇到了双引号和单引号问题,它正在生成错误。
    • 在 SQLITE 中创建一个小提琴并尝试使用它,分享小提琴,我会看看
    • 它在 MySql 中工作,但我一直试图让它工作 websql 但不工作
    • 使用 SqlLite Fiddle 和查询更新
    【解决方案2】:

    试试下面的查询,

    select * from contact_group join contact_list on contact_group.id= contact_list.gid
    

    【讨论】:

    • 谢谢,我已经试过了。它不会将contact_list 分组为contact_group 下的对象
    猜你喜欢
    • 2014-06-01
    • 2016-12-04
    • 2012-09-30
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多