从多个表中选择 - 重复数据

时间:2014-01-08 00:42:01

标签: mysql

我正在尝试从两个MySQL表中检索一些数据,并且我遇到了一个小问题,阻止了同一数据的多个出现在查询中。

我所拥有的是一个系统,用户可以注册一个帐户,然后将多个设备注册到该帐户。对于每个设备,他们可以从我的每个应用程序提交数据。此数据将具有特定于该设备的唯一ID(下面的Table_Data表中的DATA_GUID) - 这允许我仅通过计算数据GUID来更新在特定设备上运行的特定应用程序的数据(根据设备ID和源应用程序计算得出。)

请参阅下面的编辑以获取直观描述

这是我的表设置;

Table_Devices

  • DEV_GUID (唯一的设备ID)
  • API_ID (唯一的帐户ID - 用于查看设备所属的帐户)
  • DEVICE_FRIENDLY_NAME (用户可用于识别设备的“友好名称”)
  • DEVICE_PLATFORM (设备平台)
  • DEVICE_MODEL (设备型号)

TABLE_DATA

  • DATA_GUID (与特定设备的特定应用程序数据相关的唯一ID)
  • SOURCE_APPLICATION (提交与DATA 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 与设备0上的应用1 具有不同的DATA_GUID,或设备1上的应用0 示例

使用上面的示例(以及提供的原始信息),我将如何检索设备信息(来自 TABLE_DEVICES )以及SOURCE_APPLICATION和DATA_GUID(来自 TABLE_DATA )在提供的Table_Devices.API_ID(在图片中表示为'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无效。我试图在第一个伪结果表中显示的内容(其中每行的数据严格正确可以这么说),但显然包括列出的额外字段。原始请求。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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”。