今天在写一条订单数据对应另一个表多条物流状态的数据库操作的时候踩了不少坑(笔者只是个弱后端的小前端),所以在此做个记录。
首先,通过LEFT JOIN查询
SELECT
o.oid,e.express_state
FROM
orders o
LEFT JOIN
express e ON o.order_express = e.express_number
GROUP BY
o.oid
//输出
//oid express_state
//1 a
//1 b
//1 c
//2 d
会发现,有时候会出现查询到,多条相同oid不同express_state的情况。
这时候,可以用GROUP_CONCAT去掉多余的数据,并把不同的express_state数据合并。
SELECT
o.oid,GROUP_CONCAT(e.express_state) AS express_state
FROM
orders o
LEFT JOIN
express e ON o.order_express = e.express_number
GROUP BY
o.oid
//输出
//oid express_state
//1 a,b,c
//2 d
如果想用上LIMIT进行分页怎么办呢?简单,把上面代码查询到的数据创建一个临时表,然后在临时表外再select,limit就行了
SELECT
*
FROM
(
SELECT
o.oid,GROUP_CONCAT(e.express_state) AS express_state
FROM
orders o
LEFT JOIN
express e ON o.order_express = e.express_number
GROUP BY
o.oid
) t
ORDER BY oid DESC LIMIT 0,1;
//输出
//oid express_state
//1 a,b,c
这里要讲一下的是,两个表的包含关系是不能反过来的。
SELECT
o.oid,GROUP_CONCAT(e.express_state) AS express_state
FROM
(
SELECT
*
FROM
orders
ORDER BY oid DESC LIMIT 0,2
) o
LEFT JOIN
express e ON o.order_express = e.express_number
GROUP BY
o.oid
//输出
//oid express_state
//1 a,b
这里即使通过limit 0,2查询了两条数据,合并后还是只有1条数据,与使用limit做分页的初衷相悖。
所以,需要用limit做分页的情况注意先进行合并字段,再用limit分页。即上面第三个代码块
完整版
SELECT
*
FROM
(
SELECT
o.oid,GROUP_CONCAT(e.express_state) AS express_state
FROM
orders o
LEFT JOIN
express e ON o.order_express = e.express_number
GROUP BY
o.oid
) t
ORDER BY oid DESC LIMIT 0,1;
本文记录了在处理数据库查询时遇到的GROUP_CONCAT和LIMIT结合使用的问题。当需要合并多条相同oid的不同express_state并进行分页时,必须先合并字段,再应用LIMIT。通过创建临时表进行中间处理,避免了数据丢失和分页效果不符的情况。
4168

被折叠的 条评论
为什么被折叠?



