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