mysql - 显示在所选字段中匹配的 WHERE 条件值

标签 mysql sql eloquent

假设我有一个名为 Citizens 的表,其中包含以下字段和值:

| ID | Name   | Age |
|----|:------:|---: |
| 1  | King   | 60  |
| 2  | Queen  | 50  |
| 3  | Prince | 25  |

如果我想显示年龄在“50100”之间的公民和其他年龄在“5”之间的公民>30",我可以使用像这样的简单 WHERE 条件:

SELECT * FROM Citizens WHERE (Age BETWEEN 5 AND 30 ) OR (Age BETWEEN 50 AND 100 );

但是,问题来了:如何在符合条件的每一行旁边显示最小和最大请求的年龄,以具有类似的东西?

| ID | Name   | Age |INTERVAL|
|----|:------:|:---:|-------:|
| 1  | King   | 60  | 50-100 |
| 2  | Queen  | 50  | 50-100 |
| 3  | Prince | 25  |  5-30  |

最佳答案

您可以使用 CASE 表达式:

SELECT Id, Name, Age,
    CASE WHEN Age BETWEEN 5 AND 30 THEN '5-30'
         WHEN Age BETWEEN 50 AND 100 THEN '50-100'
         ELSE 'OTHER' END AS INTERVAL
FROM Citizens
WHERE (Age BETWEEN 5 AND 30) OR (Age BETWEEN 50 AND 100);

注意:我不确定您是否只想显示特定的年龄范围。如果是这样,请保持当前的 WHERE 子句不变。相反,如果您想包含所有数据,请删除 WHERE 子句。在这种情况下,不匹配的范围将报告为 OTHER

另一种可能扩展性更好的方法是使用区间表:

start | end | interval
5     | 30  | 5-30
50    | 100 | 50-100

然后加入这个表,带入区间标签:

SELECT c.Id, c.Name, c.Age, i.interval
FROM Citizens c
INNER JOIN interval i
    ON c.Age BETWEEN i.start AND i.end
WHERE (c.Age BETWEEN 5 AND 30) OR (c.Age BETWEEN 50 AND 100);

第二种方法的一个主要可能优势是可以引入索引策略。

关于mysql - 显示在所选字段中匹配的 WHERE 条件值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53818502/

相关文章:

mysql - 附加查询

php - Laravel Eloquent 发现返回 null

mysql - 如何将一个表多次加入另一个表

c# - 存储需要重复使用的密码的最佳实践?

mysql - 将数据字段拆分为两列并将其插入现有表(MYSQL)

mysql - 没有偏移量的基于游标的分页?

mysql - 如何找到彼此喜欢的人?

mysql - SQL组_CONCAT

php - 工会中的 Laravel 关系冲突

php - Laravel 将 JSON 转换为数组?