Red Hat
Guest
НЕ совсем тривиальный запрос для смешной вроде задачи
MySQL 4.1.7
Есть универсальная таблица properties со свойствами подписчиков
например
number property value
12345 sex m
12345 age 29
12345 nick george
12345 height 175
21312 sex m
21312 age 29
21312 height 190
14221 sex w
14221 age 17
14221 height 160
Например требуется выбрать всех мужчин 29 лет и еще вывести (а также и отсортировать) их по кол-ву существующих свойств
Т.е в результате выполнения должно быть следующее:
12345 4
21312 3
Запрос вида
SELECT number
FROM properties
WHERE number
IN (SELECT number
FROM `properties`
WHERE property = 'sex'
AND value = 'm'
)
AND property = 'age'
AND value = '29';
конкретно тяжелый, у меня он гоняется 90 секунд...
После колдования получил следующее
SELECT number, cntallsum FROM (
SELECT number, sum( cnt ) AS cntsum, sum( cntall ) AS cntallsum FROM (
SELECT number , count( number ) AS cnt, '0' AS cntall FROM properties WHERE (property = 'sex' AND value = 'm') OR (property = 'age' AND value = '29') GROUP BY number
UNION ALL
SELECT number , '0' AS cnt, count( number ) AS cntall FROM properties WHERE property IN ('nick', 'sex', 'age', 'height', 'weight', 'goal', 'details') AND `value` != '' GROUP BY number
) AS tmptable
WHERE (cnt =2 || cnt =0)
GROUP BY number ORDER BY cntsum DESC) AS resulttable WHERE cntsum =2;
Летает, но... надеюсь понятно... ))))
Есть предложения по оптимизации запроса?
MySQL 4.1.7
Есть универсальная таблица properties со свойствами подписчиков
например
number property value
12345 sex m
12345 age 29
12345 nick george
12345 height 175
21312 sex m
21312 age 29
21312 height 190
14221 sex w
14221 age 17
14221 height 160
Например требуется выбрать всех мужчин 29 лет и еще вывести (а также и отсортировать) их по кол-ву существующих свойств
Т.е в результате выполнения должно быть следующее:
12345 4
21312 3
Запрос вида
SELECT number
FROM properties
WHERE number
IN (SELECT number
FROM `properties`
WHERE property = 'sex'
AND value = 'm'
)
AND property = 'age'
AND value = '29';
конкретно тяжелый, у меня он гоняется 90 секунд...
После колдования получил следующее
SELECT number, cntallsum FROM (
SELECT number, sum( cnt ) AS cntsum, sum( cntall ) AS cntallsum FROM (
SELECT number , count( number ) AS cnt, '0' AS cntall FROM properties WHERE (property = 'sex' AND value = 'm') OR (property = 'age' AND value = '29') GROUP BY number
UNION ALL
SELECT number , '0' AS cnt, count( number ) AS cntall FROM properties WHERE property IN ('nick', 'sex', 'age', 'height', 'weight', 'goal', 'details') AND `value` != '' GROUP BY number
) AS tmptable
WHERE (cnt =2 || cnt =0)
GROUP BY number ORDER BY cntsum DESC) AS resulttable WHERE cntsum =2;
Летает, но... надеюсь понятно... ))))
Есть предложения по оптимизации запроса?