如何使用mysql中的连接并避免响应中的重复条目

row*_*kus 0 mysql sql

我已经尝试了这两个并继续获得每个信用数据条目的重复:

SELECT DISTINCT * FROM
FROM  `mediaDATA` 
LEFT JOIN media_creditsDATA ON mediaDATA.id = media_creditsDATA.media_id

SELECT * 
FROM  `mediaDATA` 
LEFT JOIN media_creditsDATA ON mediaDATA.id = media_creditsDATA.media_id
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

OLI*_*KOO 9

首先,使用distinct *是违反直觉的,您实际上是在选择表中的每一行,然后消除重复的行.尽量避免使用它.

因为你已经尝试过,distinct它消除了你从表中重复数据开始的可能性.看着你的截图我认为行不重复.它们在某些列上可能相同但不能完全相同.例如.

media:
id          name
----------- ---------------
1           mediaA
2           mediaB
3           mediaC

media_creditsDATA:
media_id    credit_id  name
----------- ----------- ---------------
1           1           good credit
1           2           ok credit
2           3           bad credit
3           4           no credit
Run Code Online (Sandbox Code Playgroud)

如果你执行以下sql distinct与否,结果是相同的:

SELECT *
FROM  media
INNER JOIN media_creditsDATA ON media.id = media_creditsDATA.media_id
Run Code Online (Sandbox Code Playgroud)

结果:

id          name            media_id    credit_id  name
----------- --------------- ----------- ----------- ---------------
1           mediaA          1           1           good credit
1           mediaA          1           2           ok credit
2           mediaB          2           3           bad credit
3           mediaC          3           4           no credit
Run Code Online (Sandbox Code Playgroud)

如果只查看结果表中的前三列,那么确定存在重复记录,但是如果查看所有列则不会.如您所见,媒体表与media_creditsDATA表有一对多的关系.结果表具有共享相同列的子集但没有重复记录的记录.


所以我认为这种情况下的问题不在于您如何过滤结果.例如,您在media_creditsDATA表中寻找的信用记录的子集是什么?或者你可能不关心,你只记录每个媒体记录的最高credit_id.

SELECT * 
FROM  media
INNER JOIN (
    select media_id, max(credit_id) as highest_credit_id from media_creditsDATA 
     group by media_id )media_creditsDATA ON media.id = media_creditsDATA.media_id
Run Code Online (Sandbox Code Playgroud)

你得到:

id          name            media_id    highest_credit_id
----------- --------------- ----------- --------------
1           mediaA          1           2
2           mediaB          2           3
3           mediaC          3           4
Run Code Online (Sandbox Code Playgroud)