【问题标题】:MySQL sampling with JOIN使用 JOIN 进行 MySQL 采样
【发布时间】:2018-08-24 19:50:22
【问题描述】:

我有一个表clients,列有idnamecompany

表格agreements 与列idclient_idnumbercreated_at

一对多的关系。

我的查询:

SELECT 
    a.name, 
    a.company,
    b.number,
    b.created_at
FROM clients a
    JOIN agreements b
        ON b.client_id = a.id
    WHERE a.id = '{$clientId}'

我有结果:

array(2) {
   [0]=>
       array(4) {
           ["name"]=>
           string(10) "Alton Wood"
           ["company"]=>
           string(10) "My company"
           ["number"]=>
           string(10) "5435635678"
           ["created_at"]=>
           string(10) "2018-08-11"
       }
   [1]=>
      array(4) {
          ["name"]=>
          string(10) "Alton Wood"
          ["company"]=>
          string(10) "My company"
          ["number"]=>
          string(10) "1234545546"
          ["created_at"]=>
          string(10) "2018-08-16"
    }
}

如何更改查询以获得输出?

array(1) {
   [0]=>
       array(3) {
           ["name"]=>
           string(10) "Alton Wood"
           ["company"]=>
           string(10) "My company"
           ["agreements"]=>
               array(2) {
                   [0]=>
                       ["number"]=>
                       string(10) "5435635678"
                       ["created_at"]=>
                       string(10) "2018-08-11"
                   }
                   [1]=>
                       ["number"]=>
                       string(10) "1234545546"
                       ["created_at"]=>
                       string(10) "2018-08-16"
                   }
               }
           }
       }
   }
}

【问题讨论】:

  • MySql 和其他风格的 SQL 返回数据表,如果您想以嵌套方式表示它,那么您可以在应用程序中进行项目。
  • 我认为有必要以某种方式使用GROUP BY,但我不知道如何
  • 这是一个 PHP/PDO 相关的问题。
  • 如果您有外键,您可能需要执行子查询来获取基于外键的agreements 表。
  • 您的查询不应与 created_at 后的“,”一起使用

标签: mysql


【解决方案1】:

我没有测试这个查询,因为我没有样本数据(如果你发布它真的很有帮助:),但是这样的事情可能会起作用。

SELECT 
    a.name, 
    a.company,
    JSON_ARRAYAGG(JSON_OBJECT('number', b.number, 'created_at', b.created_at)) AS agreements
FROM clients a
JOIN agreements b
ON b.client_id = a.id
WHERE a.id = '{$clientId}'
GROUP BY 1,2

编辑: 如果您希望将答案作为数组,您可以使用

SELECT 
    a.name, 
    a.company,
    JSON_ARRAYAGG(JSON_ARRAY(b.number, b.created_at)) AS agreements
FROM clients a
JOIN agreements b
ON b.client_id = a.id
WHERE a.id = '{$clientId}'
GROUP BY 1,2

但在这种情况下,您将丢失密钥。

希望对你有帮助

【讨论】:

  • 它有效。但是您可以对数组 contacts 执行此操作,而不是 json_object contacts?
  • 联系人? (你是说协议吗?)。您可以使用: -- JSON_ARRAYAGG(JSON_ARRAY(b.number, b.created_at)) AS 协议 -- 如果这是您正在寻找的,但您会丢失密钥
  • 这不是我想要的效果。我想要一个我在以下词后描述的数组:“如何更改我的查询以便获得输出?”在我的问题中。没有 json,只有数组。
  • 不要相信有一个开箱即用的工具可以得到准确的输出。 MySQL 使用没有键的数组,或者您可以使用 JSON 格式。您可能可以尝试自己构建它。你可能可以检查这个类似的问题stackoverflow.com/questions/46815766/…
猜你喜欢
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 2022-10-03
  • 2011-12-19
  • 2013-01-04
  • 2014-06-19
  • 2018-05-18
  • 2015-02-06
相关资源
最近更新 更多