php - 具有多个 where 子句的 select 查询是否在一个结果表中返回多个结果行?

标签 php mysql sql performance query-optimization

我有一个查询,例如:

SELECT COUNT(id) AS user_list FROM tbl_users
WHERE (enrolled = 1 AND age >=15 AND age < 20)
OR (enrolled = 1 AND age >=20 AND age < 25)
OR (enrolled = 1 AND age >=25 AND age < 30)
OR (enrolled = 1 AND age >=30)

如何让它为一行和一个表中的每个 where 条件返回结果:

user_list
---------
   18    --(enrolled = 1 AND age >=15 AND age < 20)
   12    --(enrolled = 1 AND age >=20 AND age < 25)
   22    --(enrolled = 1 AND age >=25 AND age < 30) 
   56    --(enrolled = 1 AND age >=30)

最佳答案

正如已经提到的,您可以使用一个案例并在一个查询中执行这一切,但是您不需要使用子查询,尽管我不是它的忠实粉丝,MySQL 允许您在分组依据,因此以下内容将起作用:

SELECT  CASE WHEN (enrolled = 1 AND age >=15 AND age < 20) THEN '15-19'
            WHEN (enrolled = 1 AND age >=20 AND age < 25) THEN '20-24'
            WHEN (enrolled = 1 AND age >=25 AND age < 30) THEN '25-29'
            WHEN (enrolled = 1 AND age >=30) THEN '30+'
            ELSE 'Other'
        END AS AgeRange 
        COUNT(id) AS user_list 
FROM    tbl_users
WHERE   Enrolled = 1
AND     Age >= 15
GROUP BY AgeRange;

注意,我仍然添加了一个 where 子句以避免扫描冗余数据。

<强> Example on SQL Fiddle

但是,如果您缺少数据,例如将返回一个空表,而不是这个:

AGERANGE    USER_LIST
15-19       0
20-24       0
25-29       0
30+         0

正如你所料。为了解决这个问题,我将创建一个伪表来选择,并左连接您的数据:

SELECT  t.Name AS Age_Range,
        COUNT(u.ID) AS User_List
FROM    (   SELECT  '15-19' AS Name, 15 AS LowerBound, 20 AS UpperBound, 1 AS Enrolled
            UNION ALL
            SELECT  '20-24' AS Name, 20 AS LowerBound, 25 AS UpperBound, 1 AS Enrolled
            UNION ALL
            SELECT  '25-29' AS Name, 25 AS LowerBound, 30 AS UpperBound, 1 AS Enrolled
            UNION ALL
            SELECT  '30+' AS Name, 30 AS LowerBound, 9999999 AS UpperBound, 1 AS Enrolled
        ) t
        LEFT JOIN tbl_Users u
            ON u.Enrolled = t.enrolled
            AND u.Age >= t.LowerBound
            AND u.Age < t.UpperBound
GROUP BY t.Name;

<强> Example on SQL Fiddle

关于php - 具有多个 where 子句的 select 查询是否在一个结果表中返回多个结果行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19679375/

相关文章:

php - 传递给构造函数的参数必须是接口(interface)的实例,给定的装饰器实例

php - 从 Laravel 中的 mysql 表中检索值

java - 无法修复 JOOQ 查询中的 "Unknown table"异常

mysql - 为什么这个 sql 联合不为我运行?

mysql - SQL通过命名不同的表来连接

php - MySQL CodeIgniter 根据第一个 Select 的列从第二个表中选择或不选择

php - 相关标签算法

mysql - MySQL中的三角形类型

php - PDO 未插入 - 无错误

sql - Postgresql:更新命令没有停止