【问题标题】:How to retrieve data by following conditions?如何通过以下条件检索数据?
【发布时间】:2013-08-14 05:58:30
【问题描述】:
+--------+------+----------+ |用户名 |命令 |时间 | +--------+------+----------+ | 1 |一个 | 2013-06-21 13:15:08 | | 1 |乙| 2013-07-31 15:58:53 | | 3 |一个 | 2013-07-31 16:01:42 | | 4 |一个 | 2013-05-01 11:05:08 | | 4 |乙| 2013-07-31 16:06:32 | | 6 |乙| 2013-07-31 17:16:08 | | 7 |一个 | 2013-04-06 17:20:36 | | 3 |乙| 2013-04-15 06:26:14 | | 7 |乙| 2013-07-31 14:53:49 | | 6 |一个 | 2013-07-31 09:56:27 | +--------+------+----------+

如何获取最后一个 Cmd 为 B 的用户 ID?

预期结果:

+--------+------+----------+ |用户名 |命令 |时间 | +--------+------+----------+ | 1 |乙| 2013-07-31 15:58:53 | | 4 |乙| 2013-07-31 16:06:32 | | 6 |乙| 2013-07-31 17:16:08 | | 7 |乙| 2013-07-31 14:53:49 | +--------+------+----------+

【问题讨论】:

  • 最后一个cmd是什么意思?所有用户在您的示例数据中只有一个 cmd。
  • 这个问题没有显示任何研究工作。
  • 是否有用户 id 为 1 的行?
  • 对不起:) 我已经编辑了我的问题。请再看一遍
  • @ILMIR - 显示您的预期输出。

标签: mysql sql select


【解决方案1】:

这里你需要像这样使用MAX(Time)UserIdCmd='B'自行加入:

SELECT t1.* FROM Table1 t1
JOIN
(
   SELECT UserId, MAX(Time) MaxTime FROM Table1
   GROUP BY UserID
)t2
ON t1.UserID = t2.UserId
AND t1.Time = t2.MaxTime
AND t1.Cmd = 'B';

输出:

| USERID | CMD |                        TIME |
----------------------------------------------
|      1 |   B | July, 31 2013 15:58:53+0000 |
|      4 |   B | July, 31 2013 16:06:32+0000 |
|      6 |   B | July, 31 2013 17:16:08+0000 |
|      7 |   B | July, 31 2013 14:53:49+0000 |

this SQLFiddle

【讨论】:

  • 是的,您的查询效果很好。非常感谢:) sqlfiddle.com 是有用的网站,感谢您的链接。
  • @ILMIR - 很高兴为您提供帮助。是的,这是非常有用的工具。
  • 请允许我再问你一个问题。假设有超过 2 个 Cmd(假设 5)这里我们使用当前条件,除了一个 - 我们不会寻找 B Cmd,但会寻找所有非 A 的 Cmd。我用 t1.Cmd 进行了测试!= 'A ',但结果包含重复的用户 ID。如何正确执行?提前致谢。
  • @ILMIR 省略 AND t1.Cmd = 'B' 应该会为您提供每个 userId 的最新记录。如果 Time 列包含重复项(UserId/MaxTime 组合匹配多个记录),则应该只存在重复的 userId。因此,将AND t1.Cmd = 'B' 更改为AND t1.Cmd <> 'A' 应该会得到预期的结果。
  • @ILMIR - 即使您使用AND t1.cmd !='A',它也应该可以正常工作,因为我们正在使用MAX() 函数,它将返回最大为Time 的记录。请参阅 this updated SQLFiddle 并使用两个以上的 Cmd。但是是的,如果有两条最长时间相同的记录,那么它将返回重复的结果用户 ID。但是您可以使用DISTINCT 关键字like this 过滤那些。但如果 CMD 不同,则不会过滤重复的用户 ID,因为两条记录不同。 like this.
【解决方案2】:

首先获取每个 Cmd 的最后日期,然后选择与该日期匹配的记录:

SELECT userId
FROM SomeTable
JOIN ( SELECT Cmd,
              MAX(Time) AS MaxTime
       FROM SomeTable
       GROUP BY Cmd
     ) MaxTable ON SomeTable.Cmd = MaxTable.Cmd
               AND SomeTable.Time = MaxTable.MaxTime

如果你只想要 B 记录:

SELECT userId
FROM SomeTable
JOIN ( SELECT Cmd,
              MAX(Time) AS MaxTime
       FROM SomeTable
       GROUP BY Cmd
       WHERE Cmd = 'B'
     ) MaxTable ON SomeTable.Cmd = MaxTable.Cmd
               AND SomeTable.Time = MaxTable.MaxTime

编辑: 误解了这个问题。请参阅 hiss056 的答案。他和我做同样的事情,但在 UserId 而不是 Cmd 上分组。比较:

SELECT SomeTable.*
FROM SomeTable
JOIN ( SELECT userId,
              MAX(Time) AS MaxTime
       FROM SomeTable
       GROUP BY userId

     ) MaxTable ON SomeTable.userId= MaxTable.userId
               AND SomeTable.Time = MaxTable.MaxTime
WHERE SomeTable.Cmd = 'B'

【讨论】:

    【解决方案3】:

    查询是:

    SELECT userID
    FROM TABLE_COMMANDE
    WHERE 
    (
     TIME = (SELECT MAX(TIME) FROM TABLE_COMMANDE WHERE CMD LIKE 'B')
    )
    

    【讨论】:

      【解决方案4】:
      select userID
      from your_table
      where CMD like 'B'
      

      【讨论】:

      • 当你不使用%LIKE 签名时,它与使用= 相同。虽然我不是反对者
      • 当然。但是,恕我直言,这取决于人们的个人喜好。重要的是得到正确的结果,而不是 SQL 的编写方式(不考虑性能)。
      • 我没有宣布你的回答无效,我也没有任何权利。我刚刚提到了评论以寻求任何读者的帮助。但是既然你提出来了,我想提一下 = 比使用 LIKE 进行精确字符串匹配要快,请在此处查看 stackoverflow.com/questions/559506/…
      猜你喜欢
      • 2013-06-19
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      相关资源
      最近更新 更多