我正在尝试从两个MySQL表中检索一些数据,并且我遇到了一个小问题,阻止了同一数据的多个出现在查询中。
我所拥有的是一个系统,用户可以注册一个帐户,然后将多个设备注册到该帐户。对于每个设备,他们可以从我的每个应用程序提交数据。此数据将具有特定于该设备的唯一ID(下面的Table_Data表中的DATA_GUID
) - 这允许我仅通过计算数据GUID来更新在特定设备上运行的特定应用程序的数据(根据设备ID和源应用程序计算得出。)
请参阅下面的编辑以获取直观描述
这是我的表设置;
Table_Devices
TABLE_DATA
我想要实现的是获取单个设备详细信息(即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
相关联的数据。
我哪里错了?
修改
我想我可能会让一些人感到困惑,所以这里有一些额外的内容可能有所帮助。
如您所见,每个应用程序的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无效。我试图在第一个伪结果表中显示的内容(其中每行的数据严格正确可以这么说),但显然包括列出的额外字段。原始请求。
答案 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”。