当前位置: 首页 > 面试题库 >

MySQL JOIN最近的行而已?

章飞虎
2023-03-14
问题内容

我有一个表客户,存储有customer_id,电子邮件和参考。还有一个附加表customer_data,用于存储对客户所做的更改的历史记录,即,当发生更改时,将插入新行。

为了在一个表中显示客户信息,需要将两个表连接起来,但是只有customer_data中的最新行才应该连接到客户表中。

由于查询是分页的,因此变得有点复杂,因此具有限制和偏移量。

我该如何使用MySQL?我想我想在某个地方放一个DISTINCT …

此刻的查询是这样的-

SELECT *, CONCAT(title,' ',forename,' ',surname) AS name
FROM customer c
INNER JOIN customer_data d on c.customer_id=d.customer_id
WHERE name LIKE '%Smith%' LIMIT 10, 20

另外,我是否认为可以通过这种方式将CONCAT与LIKE一起使用?

(我很欣赏INNER JOIN可能是错误的JOIN类型。实际上我不知道不同的JOIN之间有什么区别。我现在要研究一下!)


问题答案:

您可能需要尝试以下方法:

SELECT    CONCAT(title, ' ', forename, ' ', surname) AS name
FROM      customer c
JOIN      (
              SELECT    MAX(id) max_id, customer_id 
              FROM      customer_data 
              GROUP BY  customer_id
          ) c_max ON (c_max.customer_id = c.customer_id)
JOIN      customer_data cd ON (cd.id = c_max.max_id)
WHERE     CONCAT(title, ' ', forename, ' ', surname) LIKE '%Smith%' 
LIMIT     10, 20;

请注意,a JOIN只是的同义词INNER JOIN

测试用例:

CREATE TABLE customer (customer_id int);
CREATE TABLE customer_data (
   id int, 
   customer_id int, 
   title varchar(10),
   forename varchar(10),
   surname varchar(10)
);

INSERT INTO customer VALUES (1);
INSERT INTO customer VALUES (2);
INSERT INTO customer VALUES (3);

INSERT INTO customer_data VALUES (1, 1, 'Mr', 'Bobby', 'Smith');
INSERT INTO customer_data VALUES (2, 1, 'Mr', 'Bob', 'Smith');
INSERT INTO customer_data VALUES (3, 2, 'Mr', 'Jane', 'Green');
INSERT INTO customer_data VALUES (4, 2, 'Miss', 'Jane', 'Green');
INSERT INTO customer_data VALUES (5, 3, 'Dr', 'Jack', 'Black');

结果(不含LIMIT和的查询WHERE):

SELECT    CONCAT(title, ' ', forename, ' ', surname) AS name
FROM      customer c
JOIN      (
              SELECT    MAX(id) max_id, customer_id 
              FROM      customer_data 
              GROUP BY  customer_id
          ) c_max ON (c_max.customer_id = c.customer_id)
JOIN      customer_data cd ON (cd.id = c_max.max_id);

+-----------------+
| name            |
+-----------------+
| Mr Bob Smith    |
| Miss Jane Green |
| Dr Jack Black   |
+-----------------+
3 rows in set (0.00 sec)


 类似资料:
  • 问题内容: 我在Postgres 9.3数据库中有一个方案,在该方案中,我必须获取出售书籍的最近10个日期。考虑以下示例: table中目前没有任何限制,但是我们有一项服务,每天只插入一个计数。 我必须获得基于的结果。当我传递ID时,应使用书名,出售日期和出售份数生成报告。 所需的输出: 问题答案: 这看起来并不令人怀疑,但这 是个难题 。 假设条件 你的数目是。 表格中的所有列均已定义。 该表在

  • 我正在纠结于分治算法对于大于2的维度是如何工作的,特别是如何在两个子问题之间找到最接近的点对。 我知道在3D的情况下,我需要将每个点与其他15个点进行比较。 我不明白的是,那15点怎么选?在2D情况下,只需按值对值进行排序,然后按顺序进行遍历。然而,在3D情况下,每个点都需要与和轴上离它最近的15个点进行比较。我似乎找不到一种方法来确定这15个点是什么,而且不存在... 我错过了什么?

  • 问题内容: 在什么情况下,选择查询不会出现在V $ SQL视图中? 例如,如果我运行此命令: 然后立即运行此命令: 在什么情况下我将不返回任何行?在这种情况下,我可以强制将查询信息记录在V $ SQL中吗? 问题答案: 在什么情况下,选择查询不会出现在V $ SQL视图中? 一种情况是在真实应用程序群集(RAC)上。在这种环境下,将仅包含当前节点的库缓存。要查看所有节点上的库缓存,请从中选择。

  • 我在计算最近的邻居。为此,我需要传递一个参数来限制与邻居的最大距离。比如半径1000米内最近的邻居是哪些? 我做了以下工作: 我用以下数据创建了我的表: 之后,我执行了以下查询: 第一个问题,巴西的SRID是4326吗?4269是什么? 第二个问题,通过执行以下SQL 这不会返回任何结果。据我所知,这个SQL将进一步指出最大距离的半径,对吗? 如果你把1000个结果放在100000000,我的所有

  • 校验者: @DataMonk2017 @Veyron C @舞空 翻译者: @那伊抹微笑 sklearn.neighbors 提供了 neighbors-based (基于邻居的) 无监督学习以及监督学习方法的功能。 无监督的最近邻是许多其它学习方法的基础,尤其是 manifold learning (流行学习) 和 spectral clustering (谱聚类)。 neighbors-bas

  • 问题内容: 我有一张用户签入和签出时间的表(“ lms_attendance”),如下所示: 我正在尝试创建此表的视图,该表将仅输出每个用户ID的最新记录,同时给我“ in”或“ out”值,如下所示: 到目前为止,我已经很接近了,但是我意识到视图将不接受子查询,这使它变得更加困难。我得到的最接近的查询是: 但是我得到的是: 这很接近,但并不完美。我知道最后一个分组依据不应存在,但是如果没有它,它