MySQL汇总来自多个表的列和行

时间:2016-11-23 00:11:27

标签: mysql

我正在尝试根据以下内容连接三个相关表中的数据:

orders    orderrow             orderrow_op
+----+    +----+----------+    +----+-------------+
| id |    | id | id_order |    | id | id_orderrow |
+----+    +----+----------+    +----+-------------+
| 1  |    | 1  | 1        |    | 1  | 1           |
| 2  |    | 2  | 1        |    | 2  | 1           |
| 3  |    | 3  | 2        |    | 3  | 2           |
+----+    | 4  | 3        |    | 4  | 3           |
          +----+----------+    | 5  | 3           |
                               | 6  | 3           |
                               +----+-------------+

我正在寻找的结果是:

orderops(期望结果)

+----------+-----------------+
| id_order | id_row:id_ops   |
+----------+-----------------+
|    1     | 1:(1,2); 2:(3); |
|    2     | 3:(4,5,6)       |
|    3     | 4:NULL          |
+----------+-----------------+

即我希望操作和行都显示在与订单相关的一行上。到目前为止,我已经尝试过这样的事情:

SELECT
    db.orders.id AS orderid,
    db.orderrow.id AS rowids,
    GROUP_CONCAT(DISTINCT db.orderrow.id) AS a,
    GROUP_CONCAT(db.orderrow.id, ':', db.orderrow_op.id) AS b
FROM
    db.orders
    LEFT JOIN db.orderrow ON db.orders.id = db.orderrow.id_order
    LEFT JOIN db.orderrow_op ON db.orderrow.id = db.orderrow_op.id_orderrow
GROUP BY orderid

在'a'列中,我得到行id,在'b'列中,我得到了带有相应row_id的operation_ids。我想将两者合并为一个列,以便“b”中的相关值将从“a”开始,并且只显示一次。

我对MySQL很新,所以我不知道这是否可能,或者我是不是一个好主意?目的是将数据结构化为JSON,以便通过REST应用程序进行交付,所以最好将行直接传递给Web服务器并在那里处理json解析?我只是认为这种方法可能会更快。

1 个答案:

答案 0 :(得分:0)

这不是最好的查询,但它适用于您的示例表设置。

SELECT 
    o.id AS id_order,
    group_concat(sub.ops
        SEPARATOR ' ') AS id_row_id_ops
FROM
    (SELECT 
        orderrow.id_order,
            IF(isnull(l3.ops), concat(orderrow.id, ':', 'NULL'), concat(orderrow.id, ':', l3.ops)) as ops
    FROM
        orderrow
    LEFT JOIN (SELECT 
        orderrow_op.id_orderrow,
            concat('(', group_concat(orderrow_op.id), '); ') as ops
    FROM
        orderrow_op
    GROUP BY orderrow_op.id_orderrow) l3 ON l3.id_orderrow = orderrow.id) sub
        LEFT JOIN
    orders o ON o.id = sub.id_order
GROUP BY o.id;

要记住的一件事是LEFT JOIN,你需要施放一个" null"价值为" null"文本(否则你的元素4将消失)。

输出:

enter image description here