2017-08-26 19 views
0

重複條目,我都試過這些,並繼續獲得每個信貸數據錄入重複:一個人如何使用加入MySQL和避免響應

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 

enter image description here

+2

請注意,在標準化數據集「DISTINCT *」中是oxymoronic – Strawberry

+5

有關更多幫助,請參閱https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-看起來對我來說是一個非常簡單的sql查詢 – Strawberry

+1

你可以提供一些示例數據,以及mediaDATA表和media_creditsDATA的外觀嗎? –

回答

8

網絡首先,使用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 

如果執行與distinct或不結果如下的sql是一樣的:

SELECT * 
FROM media 
INNER JOIN media_creditsDATA ON media.id = media_creditsDATA.media_id 

結果:

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 

如果僅看在前三列結果表格,然後確定有重複的記錄,但是如果您查看所有列,則不能。正如您所看到的,媒體表具有與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 

你:

id   name   media_id highest_credit_id 
----------- --------------- ----------- -------------- 
1   mediaA   1   2 
2   mediaB   2   3 
3   mediaC   3   4 
2

,如果你不「不想重複行,你應該只有你真正需要的
如的值,用獨特的和明確的列名:

SELECT distinct id, company_id, associated_company_id, title, year, `desc`, media_file 
    FROM mediaDATA 
    LEFT JOIN media_creditsDATA ON mediaDATA.id = media_creditsDATA.media_id 
0
select * from mediaDATA LEFT JOIN media_creditsDATA 
ON mediaDATA.id = media_creditsDATA.media_id 
where mediaDATA.id in (
select DISTINCT(media_id) 
from media_creditsDATA 
) 

大多數人會說,你應該添加DISTINCT上的主要選擇ID。你可以試試,但我很確定它會降低性能。

0

因爲有在media_creditsDATA表具有相同media_id多行,因爲它不是media_creditsData的PK你得到你的第一條語句重複。該表的非關鍵數據可能在所有media_ids中都是相同的(這將是一個奇怪的模型),但我們當然不能這樣認爲。鑑於此,爲此目的不同,將是不可靠的。

你有兩個選擇:

選擇從media_creditsDATA領域的不同子集,並連接到這裏,如:

select * 
from mediaData 
LEFT OUTER JOIN 
(select distinct media_id, field1, field2, field3 from media_creditsDATA) t 
ON t.media_id = mediaData.id 

這將工作,只要有與記錄中沒有變化所需字段的media_id相同。如果有變化,你會再次看到重複。

更可靠的選擇是決定什麼聚合條件對media_creditsDATA記錄有意義。如果您不想在一個以上的記錄中使用多個記錄,那麼您需要哪一個?也許有辦法找到最新的,第一等的?這種查詢可以是這個樣子:

Select * 
    from mediaData 
    LEFT OUTER JOIN 
    (select * 
    from media_creditsDATA 
    inner join 
    (select media_id, max(%some_date% or %some_id% 
     from media_creditsDATA 
     group by media_id) mc_t 
    on mc_t.media_id = media_creditsDATA.media_id 
    and mc_t.%aggregated_column% = media_creditsDATA.%same_column) t 
    ON t.media_id = mediaData.id 

這將確保該子查詢將返回這裏1或0行。

+0

我不認爲media_creditsDATA表中有多個行具有相同的media_id。如果media_creditsDATA有多行'Distinct'會在結果表中刪除重複的行。 –

+0

只有具有相同media_id的多行包含相同的非關鍵數據時,從建模角度來看,這些數據沒有多大意義。 OP的查詢選擇*,因此非關鍵數據可能會有所不同,這意味着DiSTINCT將選取兩個/全部。 – Dan