我有一张这样的表
itemid | propertyname | propertyvalue
___________|______________|_______________
1 | point | 12
1 | age | 10
2 | point | 15
2 | age | 11
3 | point | 9
3 | age | 10
4 | point | 13
4 | age | 11
我需要一个查询来选择年龄大于10且小于12的所有项目。
我试过
`select itemid from table where (propertyname="point" and propertyvalue < 12)
and (propertyname="age" and propertyvalue >10)`
没有结果。我怎样才能使它发挥作用?
答案 0 :(得分:2)
您可以使用inner join
SELECT
a.itemid
FROM
yourTable a
INNER JOIN
yourTable b
ON
a.itemid=b.itemid
AND a.propertyname='point'
AND b.propertyname='age'
WHERE
a.propertyvalue<12
AND b.propertyvalue>10
好吧所以在表格中你要查找名称为point且值小于12的所有项目,在表格b中你要查找名称年龄和值大于10的所有项目。然后你只需要查找项目,两张桌子都有。为此,您可以在itemid上连接两个表。要连接表,请使用连接。希望这会帮助你理解。如果不再问:)
答案 1 :(得分:1)
要在同一个查询中将表连接到自身,您可以在FROM
子句中包含该表两次,每次都为其提供不同的别名。然后,您只需继续构建查询,就像处理两个恰好包含完全相同数据的单独表一样。
在下面的查询中,表格example
的别名为a
和b
:
SELECT a.itemid
FROM example a, example b
WHERE a.itemid = b.itemid
AND a.propertyname = 'point'
AND a.propertyvalue < 12
AND b.propertyname = 'age'
AND b.propertyname > 10
答案 2 :(得分:1)
试一试:
SELECT itemid FROM test_table WHERE propertyname="point" AND propertyvalue < 12 AND itemid IN(SELECT itemid FROM test_table WHERE propertyname="age" AND propertyvalue >10)
答案 3 :(得分:0)
PLs试试这个
select itemid from table where (propertyname="point" and propertyvalue < 12)
or (propertyname="age" and propertyvalue >10);
答案 4 :(得分:0)
您可以使用内部联接。意思是,就像你要使用2个表一样:第一个你将选择name =“age”和val> 10,第二个是你要选择name =“point “和val&lt; 12。 这就像你正在创建一个不存在的表的实例。它只是帮助您同时提取所需的数据。
答案 5 :(得分:0)
这是一个想法......
SELECT item_id
, MAX(CASE WHEN propertyname = 'point' THEN propertyvalue END point
, MAX(CASE WHEN propertyname = 'age' THEN propertyvalue END age
FROM a_table
GROUP
BY item_id
HAVING age+0 > 10
AND point+0 < 12;