繁体   English   中英

MySQL的。 从第二张表中选择最后一条记录(按创建时间)

[英]MySQL. Select last record (by created time) from second table

我通过userPhone有2个表链接。

用户

+-----------+-------+----------+--------+
| userPhone |  name | address  |  car   |
+-----------+-------+----------+--------+
| 096111111 | Bill  |  adr1    | {json} |
+-----------+-------+----------+--------+
| 097333333 | Max   |  adr2    | {json} |
+-----------+-------+----------+--------+
| 098888888 | Denis |  adr3    | {json} |
+-----------+-------+----------+--------+

顺序

+-----------+---------+-------+-------+------------+
| userPhone | orderID | title | Descr | createdTS  |
+-----------+---------+-------+-------+------------+
| 096111111 | 59      | ttl1  | qqqq  | 1444999740 |
+-----------+---------+-------+-------+------------+
| 096111111 | 58      | ttl2  | wwww  | 1444999650 |
+-----------+---------+-------+-------+------------+
| 096111111 | 56      | ttl3  | rrrrr | 1444999600 |
+-----------+---------+-------+-------+------------+
| 096111111 | 57      | ttl4  | ttttt | 1444999540 |
+-----------+---------+-------+-------+------------+

我正在使用这样的请求,并且效果很好:

SELECT
      `users`.`userPhone`,
      `users`.`name`,
      `users`.`address`,
      `users`.`car`,
      (SELECT `title` FROM `orders` WHERE `orders`.`userPhone` = `users`.`userPhone` AND `orders`.`orderTS` < NOW()  ORDER BY `orders`.`createdTS` DESC LIMIT 1 ) as `title`,
      (SELECT `descr` FROM `orders` WHERE `orders`.`userPhone` = `users`.`userPhone` AND `orders`.`orderTS` < NOW()  ORDER BY `orders`.`createdTS` DESC LIMIT 1 ) as `descr`
FROM
              `users`
               LEFT JOIN `orders` USING (`userPhone`)
WHERE 
               `users`.`userPhone` like '%1111%';

但是我认为其他SELECT的工作速度很慢。 有没有更好,更快的解决方法?

如何使用另一个请求获得相同的结果(可能没有其他SELECT)。

语法正确的JOIN将为您完成所有这些操作,而无需内部SELECT且速度更快。

SELECT
      `users`.`userPhone`,
      `users`.`name`,
      `users`.`address`,
      `users`.`car`,
      `orders`.`title`,
      `orders`.`desc`
FROM `users`
     JOIN `orders` ON `orders`.`phone` = `users`.`phone`
WHERE 
      `users`.`userPhone` like '%1111%'
  AND `orders`.`orderTS` < NOW() 
ORDER BY `orders`.`orderTS` DESC
LIMIT 1;

如果您想要所有这些记录,则只需删除LIMIT 1

如果您使用内部SELECT,则不需要JOIN或LEFT JOIN任何表

尝试这个

SELECT
      `users`.`userPhone`,
      `users`.`name`,
      `users`.`address`,
      `users`.`car`,
      (SELECT `title` FROM `orders` WHERE `orders`.`userPhone` = `users`.`userPhone` AND `orders`.`orderTS` < NOW()  ORDER BY `orders`.`createdTS` DESC LIMIT 1 ) as `title`,
      (SELECT `descr` FROM `orders` WHERE `orders`.`userPhone` = `users`.`userPhone` AND `orders`.`orderTS` < NOW()  ORDER BY `orders`.`createdTS` DESC LIMIT 1 ) as `descr`
FROM
              `users`
WHERE 
               `users`.`userPhone` like '%1111%';

这应该更快

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM