【问题标题】:Join 2 tables resulting in multidimensional array连接 2 个表,生成多维数组
【发布时间】:2016-04-10 03:34:18
【问题描述】:

我有 2 个(mysql)表:

orders:
   order_number

deliveries:
   id, order_number, status

订单可以在交货表中有多个交货。现在我查询 50 个订单,然后循环它们 (php) 并查询交付表中 order_number = orders.order_number 的交付并合并数组。

理想情况下,这是一个查询,而不是 51 个。我尝试了 100 种连接和组的组合,但无法破解这个看似简单的查询。结果应该是:

[orders] => Array
    (
        [0] => Array
            (
                [order_number] => 16021322220558
                [deliveries] => Array
                    (
                        [0] => Array
                            (
                                [id] => 13332
                                [order_number] => 16021322220558
                                [status] => delivering
                            )
                        [1] => Array
                            (
                                [id] => 13333
                                [order_number] => 16021322220558
                                [status] => delivering
                            )
                    )

            )
        [1] => Array
            (
                [order_number] => 16021322220559
                [deliveries] => Array
                    (
                        [0] => Array
                            (
                                [id] => 13334
                                [order_number] => 16021322220559
                                [status] => delivering
                            )
                        [1] => Array
                            (
                                [id] => 13335
                                [order_number] => 16021322220559
                                [status] => delivering
                            )
                    )

            )
        ...
    )

编辑:这就是我最终的结果。 IN 是从 51 个查询减少到 2 个查询的洞察力!

<?php
// Query for the last 50 orders
$q_orders['orders'] = // SELECT * FROM orders LIMIT 50

// Create array of order numbers
foreach($q_orders['orders'] as $order){
    $order_numbers[] = $order['order_number'];
}   

// Query for all the deliveries
$q_deliveries = // SELECT * FROM deliveries WHERE order_number IN ($order_numbers)

// For each order, append the deliveries with the same order_number
$i = 0;
foreach($q_orders['orders'] as $order){

    foreach($q_deliveries as $delivery){

        if($delivery['order_number'] == $order['order_number']){

            $q_orders['orders'][$i]['deliveries'][] = $delivery;

        }

    }

    $i++;

}

【问题讨论】:

  • 堆栈中的大多数人可能会帮助您完成此查询,但我们需要更多关于您的表结构及其关系的信息(主要 order_number 在哪里?在哪里是其余的信息吗?)如果你给我这些信息,我可能会帮助你。 - 如果您使用 phpmyadmin,带有必要表格和关系的图表截图会很棒!
  • @Babydead orders 表包含 order_number,deliveries 表包含 id、order_number 和 status
  • @Babydead 我在问题中添加了这些字段。我目前正在查询订单表以获取包含“主订单号”的所有订单,然后为每个订单查询包含该订单号的每个交货的交货表。

标签: php mysql multidimensional-array


【解决方案1】:

好的,就我所能收集到的,我会这样说:

SELECT id, orders.order_number, status
 FROM orders, deliveries
  WHERE orders.order_number = 'ordernumber'
   AND deliveries.order_number = orders.order_number 

但是,我很困惑为什么您首先需要原始订单号。您可以直接选择deliveries.order_number,不是吗?像这样:

SELECT id, order_number, status
     FROM deliveries
      WHERE order_number = 'ordernumber'

现在是一些 PHP 魔法(我相信这应该会有所作为,但我目前无法对其进行测试)

<?php
    $result = mysql_query($query);
    $result_array = array();

    while($row = mysql_fetch_array($result)){
      $result_array[] = $row;
    }
?>

对不起,我相信我现在明白你的问题了。 在那种情况下,不,您不能使用 mysql 返回一个自然的基于 php 的多维数组。 (mysql 无法格式化特定语言的结果)

如果您想更改结果的排序方式,您将始终需要手动合并数组。

编辑:对于多订单查询

SELECT id, order_number, status
     FROM deliveries
      WHERE order_number IN (2323, 34, 25, 44646, 24, 26)

你会想要使用IN。这意味着查询将获取这些订单号中的任何一个。用这样的 php 数组填充 IN 非常容易:

<?php
 $ordernumbers = implode(",", $arrayWithOrderNumbers);
 $query = "SELECT id, order_number, status
     FROM deliveries
      WHERE order_number IN ($ordernumbers)";
?>

IN 基本上是这个的缩写:WHERE order_number = 34 OR order_number = 35 OR order_number = 34

等等。等等

【讨论】:

  • 现在玩这个 - 非常感谢。我当然明白它不会格式化它,我主要是想弄清楚如何用 1 个查询来完成它。两个表中都有一堆额外的字段,我只是使用了 about 示例来简化它,这就是为什么我不能只查询 Deliveries 表。
  • 哦!您的意思是在 1 个查询中找到 50 个不同的订单?很抱歉,让我快速更新我的答案,查询那个答案!
  • 好的,所以这将是 2 个正确的查询(这比 50 好得多!) - 一个用于获取 order_numbers,下一个用于获取具有这些订单号的交货......现在测试
  • 我想如果我知道你从哪里得到 order_numbers 会很有帮助。这可能是让我看不到大局的原因。无论如何,我希望你能弄清楚,我很快就要睡觉了(这里快 7 点了)
  • 我在订单表中查询最新的 50 个订单 - 这些订单带有 order_numbers
猜你喜欢
  • 2017-10-11
  • 2016-01-01
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
  • 2017-05-09
  • 2023-03-05
  • 2017-10-19
相关资源
最近更新 更多