Mysql 按表达式的结果对每个结果/用户生成的元数据排序

Mysql 按表达式的结果对每个结果/用户生成的元数据排序,mysql,sql,database,sql-order-by,metadata,Mysql,Sql,Database,Sql Order By,Metadata,基本上,我有一些用户为单个项目生成的元数据。元数据由标题和相应的值组成。一个项目可能有一个特定的元数据标题,而另一个项目可能没有。因此,在我的主表中创建一个新的collumn似乎是错误的方法,因为我不希望每个项目都有相同的元数据标题 问题是我什么时候想按元数据排序。我可以很容易地生成一个表,使元数据看起来像另一个collumn,但我想按此进行排序。因此,为了说明我所拥有的: 假设我有以下表格: Items Table: id | color ---------- 0 | red 1 | pi

基本上,我有一些用户为单个项目生成的元数据。元数据由标题和相应的值组成。一个项目可能有一个特定的元数据标题,而另一个项目可能没有。因此,在我的主表中创建一个新的collumn似乎是错误的方法,因为我不希望每个项目都有相同的元数据标题

问题是我什么时候想按元数据排序。我可以很容易地生成一个表,使元数据看起来像另一个collumn,但我想按此进行排序。因此,为了说明我所拥有的:

假设我有以下表格:

Items Table:
id | color
----------
0  | red
1  | pink
2  | orange

MetaData Table
itemId |     title     |     data
-----------------------------------------
   0        shape           round
   1   |    shape      |    square
   0   |    sound      |    LOUD!
我可以轻松编写SQL和代码,从这些表生成如下内容:

id  |    color   |   shape    |   sound
--------------------------------------------
0   |    red     |   round    |   LOUD!
1   |    pink    |   square   |            
2   |   orange   |            |   
所以,当生成该项时,如果一个项没有我正在显示的元数据标题,那么它就被保留为空。我想让用户排序的形状或声音,只是有那些是空白显示在底部

我可以输入所有数据,生成表格,然后在代码中对其进行排序……但是……对于我可能需要处理的数百个条目来说,这根本不实际

在SQL中可以做到这一点吗(我使用的是mysql,但如果我改变它,使用更通用的东西会更好)?我的表格布局是否不切实际/我是否应该换一种方式(我不想改变我的表格布局)


谢谢

> P>你可以把空白值放在底部,比如:

select
  Items.id,
  Items.color,
  max(case when title = 'shape' then data else null end) as shape,
  max(case when title = 'sound' then data else null end) as sound
from Items left outer join MetaData
on Items.id = MetaData.itemId
group by Items.id, Items.color
order by
  case when shape is not null then 0 else 1 end,
  shape

好的,如果您在mysql中成功地实现了透视,我的意思是,在查询中添加
shape
作为列,那么您使用的是
CASE
if
语句

因此,您需要做的唯一一件事是为它们指定一个别名,然后按该别名排序


就是这样:)

史蒂夫·卡斯的解决方案有问题。无论如何,在对pivot表进行了更多的阅读和一些实验之后,以下是我的工作解决方案,供感兴趣的人参考:

SELECT DISTINCT items.id, items.color, 
GROUP_CONCAT(CASE WHEN metaData.title = ? THEN metaData.data ELSE NULL END) AS metaDataSortItem FROM items 
LEFT OUTER JOIN metaData ON items.id=metaData.itemId 
GROUP BY items.id
ORDER BY metaDataSortItem ASC

它似乎按照我的预期工作。

您能在查询中使用UNION生成所有包含元数据的记录,然后将其与不包含元数据的记录合并吗。但通过这种方法,您将无法使用ORDERBY子句。谢谢!这正是我要找的,我有点不确定如何使用别名,然后按别名排序,所以这也很有帮助。在尝试了这个之后,似乎你不能使用带有order by的别名。。。我必须继续挖掘如何让它工作,但万一有人读到这篇文章..上面的SQL对你不起作用(至少对Mysql是这样)。我提出了一个解决方案,并将其作为一个新的解决方案发布…我很想知道你对我提出的有什么问题。再次感谢!