2012-04-06 2 views
0

предположим, у меня естьподсчета предметов, которые удовлетворяют имеющие запрос

SELECT * FROM table t 
GROUP BY j 
HAVING condition_one OR condition_two OR condition_three 

как я могу изменить запрос таким образом, что она возвращает количество сколько строк удовлетворяет три условия, имеющие пункт

так в идеале выход будет иметь что-то вроде:

condition_one: 100 
condition_two: 200 
condition_three: 300 

при этом имеется 100 пунктов, удовлетворяющих condition_one, 200, удовлетворяющих condition_t и т.д.

+0

Таким образом, существует двусмысленная часть этого вопроса. Вы пытаетесь подсчитать общее количество отдельных записей, которые удовлетворяют каждому условию перед группой? Или количество записей после группы? Поскольку после применения группы by, у вас остается только одна запись для каждого отдельного значения j. Поэтому, если вы хотите подсчитать, сколько значащих значений j существует, где по крайней мере одна запись с этим значением j также соответствует каждому условию, это намного отличается от подсчета общего количества фактических записей перед группой. Я могу дать решения для обоих, если вы можете сказать, что вам нужно. – Jim

ответ

0

Если вы используете пункт having, вы фактически потеряете эти записи. Поэтому вы не можете использовать предложение having. Кроме того, если вы используете OR s, то у вас не будет условий, которые приведут к true.

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

SELECT 
    SUM(condition_one) condition_one, 
    SUM(condition_two) condition_two, 
    SUM(condition_three) condition_three 
FROM (
    SELECT * FROM t 
    GROUP BY j 
) final 

Обратите внимание, что condition_one действительно состояние, такие как age = 23, но условия в MySQL вернуться 0 для false и 1 для true так что вы можете SUM условиях.

Теперь, если вы хотите иметь их в ряды, это немного сложнее, потому что вам придется UNION каждое значение независимо:

SELECT 'condition_one: ' Condition, SUM(condition_one) ConditionCount FROM (
    SELECT * FROM t GROUP BY j 
) s1 
UNION ALL 
SELECT 'condition_two: ', SUM(condition_two) FROM (
    SELECT * FROM t GROUP BY j 
) s2 
UNION ALL 
SELECT 'condition_three: ', SUM(condition_three) FROM (
    SELECT * FROM t GROUP BY j 
) s3 

Или, по крайней мере, это самый лучший способ, которым я могу думать прямо сейчас. Надеюсь это поможет!

2
SELECT 
    SUM(IF(condition_one,1,0)) AS condition_one, 
    SUM(IF(condition_two,1,0)) AS condition_two, 
    SUM(IF(condition_three,1,0)) AS condition_three 
FROM (
    SELECT * FROM t 
    GROUP BY j 
) AS baseview 
+1

В качестве альтернативы 'COUNT (IF (condition_one, 1, NULL))' – knittl

+0

@knittl Хотя вы правы с современными версиями MySQL, у меня были плохие впечатления от 'COUNT()' over 'null' в прошлых (древних?) Версиях , поэтому я склонен придерживаться всего, что не использует 'null'. –