我正在尝试根据以下内容连接三个相关表中的数据:
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 |
+----+-------------+
我正在寻找的结果是:
+----------+-----------------+
| 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解析?我只是认为这种方法可能会更快。
答案 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将消失)。
输出: