【问题标题】:Order MySQL data by row value按行值对 MySQL 数据进行排序
【发布时间】:2012-07-12 08:36:55
【问题描述】:

我有两个如下所示的表:

表格:项目

id | itemId
---|------
0  | 1
1  | 2
2  | 3

表:item_specs

id | itemId | key          | values
---|--------|---------------
0  | 1      | itemreceived | 2012-06-01
1  | 1      | modelyear    | 1992
2  | 1      | model        | 2
3  | 2      | itemreceived | 2012-06-05
4  | 2      | modelyear    | 2003
5  | 2      | model        | 1
6  | 3      | itemreceived | 2012-07-05
7  | 3      | modelyear    | 2000
8  | 3      | model        | 3

我当前的查询如下所示:

SELECT items.*, item_specs.* FROM item_specs
INNER JOIN item_specs ON items.itemId = item_specs.itemId
WHERE itemId IN(1,2,3)

如何按键值对结果进行排序,例如:模型?

我正在寻找的结果是这样的:(如果我按型号订购)

id | itemId | key          | values
---|--------|---------------
3  | 2      | itemreceived | 2012-06-05
4  | 2      | modelyear    | 2003
5  | 2      | model        | 1
0  | 1      | itemreceived | 2012-06-01
1  | 1      | modelyear    | 1992
2  | 1      | model        | 2
6  | 3      | itemreceived | 2012-07-05
7  | 3      | modelyear    | 2000
8  | 3      | model        | 3

返回的内容按具有键模型的值排序

【问题讨论】:

  • 你的意思是ORDER BY key, value
  • 这应该很容易,但你需要明确你想要什么。给定上面的表格,显示您正在寻找的结果。是否要过滤表?对表格进行排序?过滤和排序表格?
  • @Patrik 我们鼓励个别问题有单独的问题条目。第二个问题实际上并不是 StackOverflow 类型的问题,但是,请在此处查看答案:stackoverflow.com/a/11035969/1132642(称为实体属性值模型)
  • @DavidManheim 啊,谢谢。是的,我知道这一点。以为我只是偷偷溜进去。
  • 结果中的行与表中的行不匹配。例如,id=6 是从哪里来的?

标签: mysql sql


【解决方案1】:
SELECT * FROM `table` WHERE `key` = 'model' ORDER BY `values` ASC

您必须手动指定表类型/存储引擎。这在您提供的结构中看不到。
阅读更多here

【讨论】:

  • 我已经稍微更新了这个问题。我想按属于键模型的值排序
【解决方案2】:

您似乎想使用 order by 子句。这将按您需要的列排序。你也可以在这里做一些偷偷摸摸的事情,比如为你首先订购的东西插入一个真/假值。

SELECT * FROM `table` 
   Order by (case When Key='model' then 0 else 1 end), values

例如,请参阅http://blog.sqlauthority.com/2007/07/17/sql-server-case-statement-in-order-by-clause-order-by-using-variable/

【讨论】:

  • 我认为你理解我的权利,但我已经更新了这个问题。我会仔细看看你的答案。
【解决方案3】:
SELECT * FROM `table` 
WHERE `key` = 'model' 
ORDER BY `values`;

【讨论】:

    【解决方案4】:

    您需要每一行的型号。您可以通过加入来做到这一点:

    SELECT items.*, item_specs.* 
    FROM item_specs
    INNER JOIN item_specs ON items.itemId = item_specs.itemId
    INNER JOIN item_specs aux ON (aux.key = 'model' and aux.itemID = item_specs.itemId)
    WHERE item_specs.itemId IN(1,2,3)
    ORDER BY aux.values/*this is the model*/, item_specs.id;
    

    或使用子选择:

    SELECT items.*, 
           item_specs.*, 
           (select aux.values 
            from item_specs aux 
            where aux.key = 'model' and aux.itemID = item_specs.itemId
            ) as model
    FROM item_specs
    INNER JOIN item_specs ON items.itemId = item_specs.itemId
    WHERE item_specs.itemId IN(1,2,3)
    ORDER BY model, item_specs.id;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      • 2012-11-06
      • 2020-01-23
      • 2022-11-12
      • 1970-01-01
      • 2021-10-29
      相关资源
      最近更新 更多