gpt4 book ai didi

mysql 在 JOIN 上返回重复项

转载 作者:行者123 更新时间:2023-11-29 04:46:58 24 4
gpt4 key购买 nike

我在数据库中有两个表。表客户看起来像这样:

----------------------------
|id | name | age | gender |
|---------------------------
|1 | CL1 | 22 | M |
|2 | CL2 | 23 | M |
|3 | CL3 | 24 | M |
|4 | CL4 | 25 | F |
|5 | CL5 | 26 | NA |
----------------------------

现在我有另一个与此客户表相关的表,请注意上表中的“id”不是 AUTO_INCREMENT 而是唯一的。

第二个表是“图像”,其中包含客户的投资组合图像,如下所示:

 ------------------------------
|id | client_id | url |
|------------------------------
|1 | 1 | img1_1.jpg |
|2 | 1 | img1_2.jpg |
|3 | 1 | img1_3.jpg |
|4 | 2 | img2_1.jpg |
|5 | 2 | img2_2.jpg |
-------------------------------

我基本上实现的是,我想从客户端表中提取所有结果,其中包括姓名、年龄、性别等,以及从图像表中提取第一个和一个结果,这意味着,如果我查询,它将必须向我显示如果我在客户表中查询 CL1,则来自图像表的 imag1_1.jpg。为此,我正在做这样的事情:

SELECT DISTINCT c.* , i.* FROM clients c LEFT JOIN images i ON i.client_id = c.id

此查询向我返回了结果,但结果重复了很多。我没有得到,或者我对 DISTINCT 代表什么感到困惑,如果它仍然返回重复项,或者我可能遗漏了一些东西。

如有任何帮助,我们将不胜感激。

最好的,

阿山

最佳答案

这是一种使用相关子查询的方法:

SELECT c.*
, ( SELECT i.url
FROM images i
WHERE i.client_id = c.id
ORDER BY i.id
LIMIT 1
) AS url
FROM clients c

您真的不需要从图像表中提取 client_id,您已经知道它的值(value)。如果需要返回images表中的id值,则需要在select list中再添加一个相关的子查询

     , ( SELECT i.id
FROM images i
WHERE i.client_id = c.id
ORDER BY i.id
LIMIT 1
) AS images_id

这种方法在大型集合上可能会变得昂贵,但它对于从客户端返回的有限数量的行执行合理。

更一般的查询是这样的形式:

SELECT c.*
, i.*
FROM clients c
LEFT
JOIN ( SELECT m.client_id, MIN(m.id) as images_id
FROM images m
GROUP BY m.client_id
) n
LEFT
JOIN images i
ON i.id = n.images_id

别名为 n 的内联 View 将从图像表中为每个 client_id 获取单个 id 值,然后我们可以使用该 id 值连接回图像表,以检索整行。

这种形式的性能可能更好,但是对于大型集合,具体化别名为 n 的内联 View 可能需要一些时间。如果您在外部查询的 client.id 表上有一个谓词,那么为了获得更好的性能,该谓词也可以在内联 View 内的 m.client_id 上重复,以限制行数。

关于mysql 在 JOIN 上返回重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17622866/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com