V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
heat
V2EX  ›  问与答

一个很复杂的 MYSQL 查询排列场景下的实现问题

  •  
  •   heat · 2015-03-07 18:38:07 +08:00 · 1831 次点击
    这是一个创建于 3551 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个产品包含了

    货号 仓库 尺码 颜色 数量 等数据
    MYSQL中也是按照这样的字段来进行存储的,但是有相同货号,不相同仓库,不同尺码的情况

    现在我需要SELECT出的数据格式需求是

    条目1——货号001 尺码 颜色 数量
    ————货号001 仓库002 尺码1的数量 尺码2的数量 尺码3的数量
    条目2——货号002 尺码 颜色 数量
    ————货号002 仓库002 尺码1的数量 尺码2的数量 尺码3的数量
    ————货号002 仓库003 尺码1的数量 尺码2的数量 尺码3的数量
    条目3——货号003 尺码 颜色
    ————货号003 仓库003 尺码1的数量 尺码2的数量 尺码3的数量
    ....

    也就是将相同货号的货品合并起来然后分支出不同的仓库和不同的尺码
    请问我要怎么写SELECT语句
    我想应该是要写多层,效率最好的办法是什么?
    8 条回复    2015-03-07 20:26:59 +08:00
    lk09364
        1
    lk09364  
       2015-03-07 19:44:04 +08:00
    依我对你这篇文章的理解……

    > 一个表里包含了:条目、货号、仓库、尺码、颜色、数量等字段来进行存储的,但是有相同货号,不相同仓库,不同尺码的情况。

    所以,最好的方法是 SELECT * FROM `table` WHERE `货号`="001"
    heat
        2
    heat  
    OP
       2015-03-07 19:51:04 +08:00
    @lk09364 恩,我也是这样想,但是效率貌似很低,要先遍历出所有货号
    然后再写一个子遍历查询...
    lk09364
        3
    lk09364  
       2015-03-07 19:55:25 +08:00
    @heat 等等……你需要SQL 输出的资料直接是字串吗?……
    lk09364
        4
    lk09364  
       2015-03-07 19:58:07 +08:00
    @heat
    抱歉,说的不清楚。

    你需要直接输出如下字串?
    1. "条目1——货号001 尺码 颜色 数量"
    2. "————货号001 仓库002 尺码1的数量 尺码2的数量 尺码3的数量"
    ……
    用空格分隔,条目号码后输出『——』,之后尺码数量的资料就需要前置『————』这个东西?
    lk09364
        5
    lk09364  
       2015-03-07 19:58:56 +08:00
    @lk09364 抱歉,大概是我理解力不足,实在理解不到这条问题。
    heat
        6
    heat  
    OP
       2015-03-07 20:05:44 +08:00
    @lk09364 是我描述的有问题,用SELECT 语句写出来可能你看的更清楚

    先搜出所有的货号:
    SELECT * FROM tbl GROUP BY 货号 ORDER BY 自增ID
    然后遍历
    然后子查询是 SELECT * FROM tbl WHERE 货号=上一个查询结果遍历出的货号 ORDER BY 自增ID

    这样的话就是第一层遍历的每个查询结果都要嵌套一个子查询。。。感觉效率非常低
    luin
        7
    luin  
       2015-03-07 20:09:01 +08:00
    为啥不在客户端做?
    lk09364
        8
    lk09364  
       2015-03-07 20:26:59 +08:00
    @heat 原来如此。第1条语句和第2条语句表格名都是tbl?
    这样的话ORDER BY 会不会方便你输出?

    > SELECT * FROM tbl ORDER BY 货号
    货号 仓库 尺码 颜色 数量
    0   1  4  4  4
    0   1  5  5  5
    1   1  4  4  4
    1   1  5  5  5
    1   1  6  6  6

    这样的话你就可以在客户端方便地整理format了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3191 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 13:24 · PVG 21:24 · LAX 05:24 · JFK 08:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.