如何在MySQL中的分组列中进行搜索? (如果可能,也在Hibernate中)

时间:2011-10-18 01:57:04

标签: mysql sql hibernate

我有下表:

Guy Table:

+------+----------+------+
| guy  | attribute| value|
+------+----------+------+
| John | age      | 12   |
| John | dollars  | 15   |
| John | candies  | 3    |
| Bob  | age      | 15   |
| Bob  | dollars  | 20   |
| Bob  | candies  | 6    |
+------+----------+------+

我怎样才能让所有符合其属性和价值观条件的人接受?

基本上我希望能够使用各种条件搜索人及其属性,例如gt,lt,ge,le,eq,ne,between等等。还能够通过“ands”对这些条件进行分组和“ors”。

例如,假设我想要那些花费超过16美元或少于5个糖果的人,所以我会尝试这样的事情:

select guy,attribute,value from guy group by guy having (attribute = 'dollars' and value > 16) or (attribute = 'candies' and value < 5);

我希望John和Bob都可以返回,但会返回一个空集(不匹配)。

这只是一个简单的查询,查询可能会像这个一样复杂

//get guys that have more than 2 candies and also have more than 16 dollars but no matter what, don't forget to get the guys which age is exactly 12
select guy,attribute,value from guy group by guy having ((attribute = 'candies' and value > 2) and (attribute = 'dollars' and value > 16)) or (attribute = 'age' and value = 12);

这最后一个查询也应该返回John和Bob,但只返回John

以下是创建表并添加行的代码:

create table guy(guy varchar(255), attribute varchar(255), value int);
insert into guy values('John', 'age', 12),('John', 'dollars', 15),('John', 'candies', 3),('Bob', 'age', 15),('Bob', 'dollars', 20),('Bob', 'candies', 6);

请记住,我以后可以添加更多人和更多属性,但所有人都将拥有相同数量的属性,例如,如果我要添加'Mario',我会执行以下插入:< / p>

insert into guy values('Mario', 'age', 18),('Mario', 'dollars', 31),('Mario', 'candies', 10);

如果我要添加属性'apples',我会执行以下插入:

insert into guy values('John', 'apples', 3), ('Bob', 'apples', 5), ('Mario', 'apples' 0);

我希望我能让自己理解,谢谢你所有的时间:)

注意:guy表是一个视图,是加入3个表的结果,所以不要担心数据库没有被规范化,也请不要告诉我查询错误(因为我已经知道了),相反,更好地告诉我应该改变它们。

编辑(2011年10月18日,上午10:08):

也许如果有办法将每个人的所有属性放在一行中?,就像这样:

+------+-----------+-------+------+------------+--------+------+------------+--------+
| guy  | attribute | value | guy  | attribute  | value  | guy  | attribute  | value  |
+------+-----------+-------+------+------------+--------+------+------------+--------+
| John | age       |    12 | John | dollars    |     15 | John | candies    |      3 |
| Bob  | age       |    15 | Bob  | dollars    |     20 | Bob  | candies    |      6 |
+------+-----------+-------+------+------------+--------+------+------------+--------+

2 个答案:

答案 0 :(得分:2)

为了得到超过16美元或少于5个糖果的家伙,使用自我加入:

SELECT g1.guy FROM guy g1
INNER JOIN guy g2 ON (g1.guy = g2.guy)
WHERE (g1.attribute = 'dollars' AND g1.value > 16)
   OR (g2.attribute = 'candies' AND g2.value < 5)

答案 1 :(得分:0)

试试这段代码..

select guy,attribute,`value`
  from guy
having (attribute = 'dollars' and value > 16) or (attribute = 'candies' and value < 5);