顺序通过每个结果/用户生成的元数据排序上的表达式的结果

时间:2012-02-27 04:58:44

标签: mysql sql database sql-order-by metadata

基本上我有一些用户为单个项目生成的元数据。元数据由标题和相应的值组成。一个项目可能具有一个特定的元数据标题,而另一个项因此,在我的主表中创建一个新的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,但是如果我改变它,更通用的东西会更好)?我的表格布局是否对此不切实际/我应该采用不同的方式(我不想更改我的表格布局)。

谢谢!

3 个答案:

答案 0 :(得分:0)

您可以将空白值放在底部,如下所示:

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

答案 1 :(得分:0)

好吧,如果你设法在mysql中设置了这个数据库,我的意思是,在查询中添加shape作为列,那么你使用的是CASEIF语句。 / p>

因此,您唯一需要做的就是为它们分配一个别名,然后按该别名排序。

就是这样:))

答案 2 :(得分:0)

Steve Kass的解决方案存在问题。无论如何,在对数据透视表和一些实验进行更多阅读之后,这是我对任何感兴趣的人的工作解决方案:

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

我的预期似乎有效。