合并和排序行

时间:2015-08-07 01:00:49

标签: sql

我有一个以下结构的表格。我正在编写一个查询来获取所有item_ids,其中key_name ='topic'和key_string_value ='invest',这是一个简单的部分。 select item_id from table where key_name='topic' and key_string_value='investing'

但是对于上面返回的所有item_ids,我想按照key_name ='importance'和key_name ='product'中每个item_id设置的值对它们进行排序。表格结构非常困难,因为我不是SQL专家。任何帮助将不胜感激。

item_id      key_name       key_string_value    Key_float_value  

 1            topic           investing            null
 1            importance        null                500
 1            product           A                  null
 1            product           B                  null 
 2             topic          Starting             null
 2            product            B                 null
 2            importance       null                 300
 2            topic            retail              null
 3            importance      null                  400 
 3            topic           investing             null
 3            product           C                   null 
 4            topic            Starting             null
 4            topic            investing           null 
 4            importance       null                 400
 4            product            D                   null

2 个答案:

答案 0 :(得分:1)

@Schwern是对的 - 你的结构应该规范化,名字也应该更好。这一切让我觉得:做作业。

作业问题的答案是self join,看起来像这样:

select t1.item_id , imp.key_float_value, prd.key_string_value 
from [table] t1
    LEFT OUTER JOIN [table] imp on imp.item_id = t1.item_id and imp.key_name='importance' 
    LEFT OUTER JOIN [table] prd on prd.item_id = t1.item_id and prd.key_name='product' 
where t1.key_name='topic' and t1.key_string_value='investing'
ORDER BY imp.key_float_value, prd.key_string_value 

`[table]上的方括号是因为使用table关键字作为表名需要将名称分隔。 TSQL的方括号。其他人使用双引号(")

答案 1 :(得分:0)

你的设计表非常糟糕,速度慢且难以使用。 SQL不是键/值存储;它适用于行,列和关系。我建议重新设计它,而不是打架。使用a NoSQL database更容易使用,更像普通的编程数据结构,或者重新设计它。

这是我建议的重新设计。

CREATE TABLE item (
    id                  INTEGER PRIMARY KEY,
    importance          INTEGER DEFAULT 0
);

CREATE TABLE item_topics (
    item_id             INTEGER REFERENCES item(id),
    topic               TEXT NOT NULL
);

CREATE TABLE item_products (
    item_id             INTEGER REFERENCES item(id),
    product             TEXT NOT NULL
);

项目本身和任何标量(即单值)属性都会进入一个表格。任何可以是列表(产品和主题)的东西都需要自己的表格,将每个项目与其元素相关联。如果这看起来很笨拙,那是因为它是,但这就是SQL的工作方式。

要查找主题为投资的所有项目,您必须加入item_topics表。

SELECT item.id
FROM item
JOIN item_topics ON item.id = item_topics.id
WHERE topic = 'investing'

然后要订购它们,请添加ORDER BY item.importance