mysql查询时取多条记录中最大时间的记录

本文介绍了一种使用concat函数简化查询数据库中用户特定记录的方法,避免了复杂的子查询编写过程。

    在查询的过程中,有时库里单个用户的数据往往会存在很多条,当我们需要查询出用户的一条数据时(最大时间对应记录或最小时间对应记录)往往要写很复杂的子查询,而其实通过一个简单的方法就可以查询。

    就是使用concat函数,就可以非常简单的查询出相应的记录。

SELECT
	uuid(),
	phone_no,
  date_time
FROM
	TABLE
WHERE
	CONCAT(phone_no, date_time) IN (
		SELECT
			CONCAT(
				phone_no,
				min(date_time)
			)
		FROM
			TABLE
		WHERE
			phone_no IS NOT NULL
		GROUP BY
			phone_no
	)
AND phone_no IS NOT NULL
GROUP BY
	phone_no;


### MySQL Left Join 获单条副表记录 为了实现 `LEFT JOIN` 只从副表获一条记录的效果,可以采用多种方法。一种常见的方式是在子查询中使用聚合函数配合 `GROUP BY` 来限制每组数据的数量,另一种则是利用窗口函数(如 `ROW_NUMBER()`),这决于所使用的 MySQL 版本。 #### 方法一:使用子查询与 GROUP_CONCAT 和 SUBSTRING_INDEX 组合 这种方法适用于较老版本的 MySQL,在不支持窗口函数的情况下依然有效: ```sql SELECT main.*, SUBSTRING_INDEX(GROUP_CONCAT(sub.column SEPARATOR ','), ',', 1) AS sub_column_value FROM main_table main LEFT JOIN ( SELECT id, column, other_columns... FROM secondary_table WHERE some_conditions GROUP BY id ) sub ON main.id = sub.main_id WHERE main.some_condition; ``` 此方案通过 `GROUP_CONCAT` 将多个匹配的结果拼接起来,再用 `SUBSTRING_INDEX` 提第一个值作为最终结果[^1]。 #### 方法二:使用窗口函数 ROW_NUMBER() 对于支持窗口函数的 MySQL 版本(5.7 及以上),推荐使用更直观高效的 `ROW_NUMBER()` 函数: ```sql WITH RankedSecondaryTable AS ( SELECT *, ROW_NUMBER() OVER(PARTITION BY main_id ORDER BY some_criteria DESC) as rn FROM secondary_table ) SELECT m.*, s.* FROM main_table m LEFT JOIN RankedSecondaryTable s ON m.id = s.main_id AND s.rn = 1 WHERE m.some_condition; ``` 这种方式不仅提高了可读性和维护性,而且通常能获得更好的性能表现[^2]。 这两种方法都可以有效地解决在 `LEFT JOIN` 中仅需保留来自关联表的一条记录的需求。具体选择哪种方式应考虑数据库版本和个人偏好等因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值