MySQL在同一个表的相同列上选择AND条件查询

时间:2016-09-14 10:46:58

标签: mysql

我有一张这样的表

    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)`

没有结果。我怎样才能使它发挥作用?

6 个答案:

答案 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的别名为ab

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)

http://sqlfiddle.com/#!9/4eafc6/1

答案 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;