【问题标题】:SELECT results from another table AS column arraySELECT 从另一个表作为列数组的结果
【发布时间】:2017-04-28 18:23:15
【问题描述】:

我不知道如何在 1 个查询结果中从 2 个表中获取结果(不能简单 JOIN)

我的 MySQL 数据库中有这两个表:

Table 1: sales
id
name
info

Table 2: users
sale_id
user_id

现在,每次销售都有不同数量的分配用户。有些销售有 2 个用户,有些销售有 10 个用户。

在单行中,我需要有来自sale 表的列,以及所有分配给它的用户(使用相同的 Sale_id 连接)

我需要这样的结果:

enter image description here

【问题讨论】:

    标签: php mysql sql web


    【解决方案1】:

    试试这个:

    SELECT s.*,
          (SELECT GROUP_CONCAT(u.user_id SEPARATOR ', ')
             FROM users u 
            WHERE u.sale_id = s.id) AS users
     FROM sales s
    

    【讨论】:

      【解决方案2】:

      对您的编程语言有一些了解会很好。 是的,正如 wogsland 和 icoder 所建议的那样,通常使用连接和循环遍历结果来构建数组。但是正如 Yoleth 所指出的,使用 GROUP_CONCAT 是您所需要的。我不知道这是否是这里的目标,但它可以减少结果中使用的内存,因为没有行重复。

      SELECT info FROM Sales AS s,
      (
          SELECT sale_id, GROUP_CONCAT(user_id) AS assigned_users
          FROM Users 
          GROUP BY sale_id) AS u 
      WHERE s.id=u.sale_id;
      

      在单个查询中,使用精美的 JOIN:

      SELECT s.info AS info, u.sale_id AS sale_id, GROUP_CONCAT(u.user_id) AS assigned_users 
      FROM Sales AS s LEFT JOIN Users AS u 
      ON s.id=u.sale_id 
      WHERE sale_id IS NOT NULL GROUP BY u.sale_id;
      

      【讨论】:

      • 感谢您的回答。目标是在子对象中获取所有分配的用户 ID,然后为每个用户加入一些其他列。我知道要在 2 个查询中完成,或者 1 个查询和一些 php 调整,但我很好奇,MySQL 是否能够在单个查询中做这样的事情。
      • 如果你真的需要,你可以使用 JOIN,但它的可读性较差,我怀疑这些键是否会被有效地使用。
      【解决方案3】:

      您可以简单地连接两个表并获得这样的查询结果集:

      saleID | saleName | userID | userName
      1      | Oct Sale | 5      | Tim   
      1      | Oct Sale | 6      | Nik
      2      | Nov Sale | 7      | Bill
      

      然后您可以遍历每一行并根据该数据构建关联数组:

      $sales = array();
      while( $row = mysqli_fetch_assoc($result)) {
          if (!array_key_exists($row['saleID'], $sales)) {
              $sales[$row['saleID']] = array(
                 'saleID'   => $row['saleID'], 
                 'saleName' => $row['saleName'],
                 'users'    => array()
              );
          }
          array_push($sales[$row['saleID']]['users'], array(
              'userID' => $row['userID'],
              'userName' => $row['userName']
          ));
      }
      

      【讨论】:

        【解决方案4】:

        嗯,MySQL 不会像这样返回给您一个漂亮的嵌套数组。但是您可以通过遍历结果来创建它。假设你的 MySQL 连接被命名为 $mysqli 然后尝试类似

        $sales = array();
        $result = $mysqli->query("SELECT sales.*, users.user_id FROM sales, users WHERE sales.id = users.sales_id");
        while ($row = $result->fetch_assoc()) {
            $sales[$row->id]['sales_id'] = $row->id;
            $sales[$row->id]['name'] = $row->name;
            $sales[$row->id]['info'] = $row->info;
            $sales[$row->id]['assigned_users'][] = $row->user_id;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-11
          • 2012-08-12
          • 2016-11-20
          • 1970-01-01
          • 2018-07-16
          • 1970-01-01
          相关资源
          最近更新 更多