基于 MySQL 中其他列的查询条件列

Posted

技术标签:

【中文标题】基于 MySQL 中其他列的查询条件列【英文标题】:Conditional column for query based on other columns in MySQL 【发布时间】:2010-10-25 08:41:23 【问题描述】:

我很确定我在某处看到过这个,但我找不到正确的术语,所以我遇到了麻烦......

假设我有一个包含用户信息的表(我们还假设它是由比我获得​​更多报酬的人创建的,因此修改架构不是一种选择。)在用户信息的各个列中,DOB 列和职称。我想要一个查询,根据这些列中的内容,将包含一个名为“Real_Title”的额外列,例如:

User_id    Job_Title    DOB
  joe_1      manager    01/01/1950
  jim_1    associate    01/01/1970
 jill_1    associate    01/01/1985
 jane_1      manager    01/01/1975

查询:

SELECT User_id, Real_Title FROM users
IF (YEAR(DOB) < 1980 AND Job_Title = "manager")
   Real_Title = "Old Fart"
ELSE IF (YEAR(DOB) < 1980 AND Job_Title = "associate")
   Real_Title = "Old Timer"
ELSE IF (YEAR(DOB) > 1980 AND Job_Title = "manager")
   Real_Title = "Eager Beaver"
ELSE IF (YEAR(DOB) > 1980 AND Job_Title = "associate")
   Real_Title = "Slacker"

我知道上面不仅是错误的,而且编码效率很低,但我想把这个想法传达出去。

有没有一种方法可以在不使用连接的情况下根据同一个表中一个或多个其他列中的信息填充一列?

目前,在获得结果后,我在 php 脚本中使用某些东西将这些结果引导到我想要的组中,但如果可以在查询中完成,那将使查询移植到其他脚本和语言很多更容易。

谢谢!

【问题讨论】:

检查我的年龄并注意我充其量是个老前辈。 【参考方案1】:
select User_id
,case 
    when (YEAR(DOB) < 1980 AND Job_Title = "manager")   then 'Old Fart'
    when (YEAR(DOB) < 1980 AND Job_Title = "associate") then 'Old Timer'
    when (YEAR(DOB) > 1980 AND Job_Title = "manager")   then 'Eager Beaver'
    when (YEAR(DOB) > 1980 AND Job_Title = "associate") then 'Slacker'
    else 'nobody'
end
as Real_Title 
from users

【讨论】:

【参考方案2】:

如果我理解正确,我认为您正在寻找CASE statement:

SELECT User_id,
        (CASE
            WHEN YEAR(DOB) < 1980 AND Job_Title = "manager" THEN "Old Fart"
            WHEN YEAR(DOB) < 1980 AND Job_Title = "associate" THEN "Old Timer"
            ...
            ELSE "Unknown Title"
        END) AS Real_Title
FROM users;

【讨论】:

以上是关于基于 MySQL 中其他列的查询条件列的主要内容,如果未能解决你的问题,请参考以下文章

有没有一种有效的方法来计算 Pandas 中的列值,使用基于其他列的条件值的前行的值?

基于 Spark DF 中 2 列的组合过滤行

基于R中其他列的列值总和[重复]

MySQL-查询

pandas基于组合逻辑筛选dataframe中两个数据列都满足条件的数据行(两个指定数据列的值都大于零的数据行)

将同一列与总和相加,以及基于不同条件的同一列的部分总和