我有一个以下结构的表格。我正在编写一个查询来获取所有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
答案 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
。