2014-01-08 110 views
0

我試圖從2個MySQL表中檢索一些數據,我遇到了一個小問題,防止在查詢中出現相同數據的多個數據。從多個表中選擇 - 重複的數據

我得到的是一個系統,用戶可以註冊一個帳戶,然後在該帳戶中註冊多個設備。對於每個設備,他們可以從我的每個應用程序提交數據。該數據將具有特定於該設備的唯一ID(下表Table_Data中的DATA_GUID) - 這允許我通過計算數據GUID(它是從設備計算的)來更新特定設備上運行的特定應用程序的數據ID和源應用程序)。

請參見下面的直觀描述

這裏編輯是我的表的設置;

Table_Devices

  • DEV_GUID (A唯一的設備ID)
  • API_ID (A唯一的帳戶ID - 用於查看哪些帳戶設備所屬的)
  • DEVICE_FRIENDLY_NAME (用戶可以用來識別設備的「友好名稱」)
  • DEVICE_PLATFORM (設備平臺)
  • DEVICE_MODEL (設備模型)

TABLE_DATA

  • DATA_GUID (涉及到具體的應用程序的數據爲特定的設備的唯一ID)
  • SOURCE_APPLICATION (應用程序wh ich提交了與數據GUID有關的數據)

我想要實現的是獲取單個設備詳細信息的列表(即, GUID,友好名稱,平臺,模型)以及與該設備相關聯的每個DATA_GUID(以及它提交的SOURCE_APPLICATION),基於我提交的API_ID。

我試過這個查詢(最後的值顯然包含有效的API_ID);

SELECT 
a.DEV_GUID, a.DEVICE_FRIENDLY_NAME, a.DEVICE_PLATFORM, a.DEV_MODEL, 
b.DATA_GUID, b.SOURCE_APPLICATION 
FROM Table_Devices a 
INNER JOIN 
Table_Data b 
WHERE a.API_ID = "value" 

不幸的是,返回的數據,裝置等,而不是返回僅與特定API_ID相關聯的數據的每個可能的組合。

我哪裏錯了?


編輯

我想我可能混淆了幾個人,所以這裏的一些額外的碎片可能會助陣。

enter image description here

正如可以看到的,DATA_GUID爲每個應用程序是單個設備上不同,但相對於上的其它設備相同的應用程序也是不同的。例如,此設備上的設備0上的應用0具有不同的DATA_GUID到設備0上的應用1設備1上的應用0例如。

使用上面的例子(連同提供的原始信息)基於提供Table_Devices.API_ID,我將如何檢索設備信息(從TABLE_DEVICES)和SOURCE_APPLICATION和DATA_GUID(從TABLE_DATA)(以表示圖片等同於'ACC0')?

我期待的結果;

| DEV_GUID | SOURCE_APPLICATION | DATA_GUID | API_ID | 
------------------------------------------------------- 
| DEV0  | APP0    | ACC0_D0_A0 | ACC0 | 
| DEV0  | APP1    | ACC0_D0_A1 | ACC0 | 
| DEV0  | APP2    | ACC0_D0_A2 | ACC0 | 
| DEV1  | APP0    | ACC0_D1_A0 | ACC0 | 
| DEV1  | APP1    | ACC0_D1_A1 | ACC0 | 
| DEV1  | APP2    | ACC0_D1_A2 | ACC0 | 
| DEV2  | APP0    | ACC0_D2_A0 | ACC0 | 
| DEV2  | APP1    | ACC0_D2_A1 | ACC0 | 
| DEV2  | APP2    | ACC0_D2_A2 | ACC0 | 
------------------------------------------------------- 

我實際回來的結果是每個細節的組合,所以例如它可能會爲其中一行顯示類似的內容;

| DEV_GUID | SOURCE_APPLICATION | DATA_GUID | API_ID | 
------------------------------------------------------- 
| DEV1  | APP2    | ACC0_D0_A1 | ACC0 | 
------------------------------------------------------- 

顯然ACC0_D0_A1,雖然它是適用於該帳戶,不適用於對DEV1運行APP2。我試圖按照第一個僞結果表中顯示的內容(其中每行的數據是嚴格地說是正確的),但顯然包括原始請求中列出的額外字段。

回答

0
SELECT 
a.DEV_GUID, a.DEVICE_FRIENDLY_NAME, a.DEVICE_PLATFORM, a.DEV_MODEL, 
b.DATA_GUID, b.SOURCE_APPLICATION 
FROM Table_Devices a 
INNER JOIN 
Table_Data b 
WHERE a.API_ID = "value" AND a.DEV_GUID = b.DATA_GUID 
+0

要關聯和限制投影(這是選擇)的選擇(這是WHERE,很好笑,是不是,但這是因爲SELECT選擇哪些字段包含在您的數據中,而WHERE選擇數據記錄應包含在結果集中) – Peter

0

您需要指定b如何連接到a,否則MySQL只能假設a中的每一行都連接到b中的每一行,正如您目前所看到的。您已經聲明a.DEV_GUID = b.DATA_GUID,因此以下ON標準將是最優的。

我會說,重新選擇b.DATA_GUID是毫無意義的,但因爲它等於a.DEV_GUID,給出以下內容。

最後你是畢竟的源應用程序。要做到這一點,你需要使用GROUP功能,即

SELECT 
    a.DEV_GUID, 
    a.DEVICE_FRIENDLY_NAME, 
    a.DEVICE_PLATFORM, 
    a.DEV_MODEL, 
    GROU_CONCAT(b.SOURCE_APPLICATION) AS SOURCE_APPLICATIONS 
FROM Table_Devices a 
INNER JOIN Table_Data b 
    ON b.DATA_GUID = a.DEV_GUID 
WHERE a.API_ID = "value" 
GROUP BY a.DEV_GUID 
0

使用MySQL的「哪裏不是」這樣的。

select DEV_GUID,second,third from TABLE_NAME1 where not exists (select * from SECOND_TABLE where DEV_GUID=TABLE_NAME1.DEV_GUID); 

我總是使用「where not」而不是「inner join」。