Как искать в сгруппированных столбцах в MySQL?(также в Hibernate, если это возможно) - PullRequest
1 голос
/ 18 октября 2011

У меня есть следующая таблица:

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, между и т. д., а также иметь возможность группировать эти условия по «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);

Я бы ожидал, что и Джон, и Боббыть возвращен, но вместо него возвращается пустой набор (без совпадений).

, и это простой запрос, запросы могут быть такими же сложными, как этот

//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);

этот последний запросдолжен также вернуть Джона и Боба, но возвращается только Джон

Вот код для создания таблицы и добавления строк:

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', я бы сделал следующие вставки:

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

и если бы я добавил атрибут 'яблок', я бы сделалследующие вставки:

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

Надеюсь, я сделал себя понятным, спасибо за ваше время:)

Примечание: таблица парней является представлением и является результатом объединения трех таблиц, так что не беспокойтесь о том, что база данных не была нормализована, также, пожалуйста, не говорите мне, что запросы ошибочны (потому что я уже знаю это), вместо этого, лучше скажите мне, что я должен изменить в них.

Редактировать (18 октября 2011, 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 ]

2 голосов
/ 18 октября 2011

, чтобы получить парней, у которых больше 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)
0 голосов
/ 18 октября 2011

Попробуйте этот код ..

select guy,attribute,`value`
  from guy
having (attribute = 'dollars' and value > 16) or (attribute = 'candies' and value < 5);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...