让我稍微简化一下表格。我有 6 张桌子。
- modemsInfo (id, idUser, idGroup, infoText) // 关于调制解调器的信息
- groupModems (id, idUser, nameGroup) // 有关可以包含调制解调器的组的信息
- data (idModem, Time, text) // 调制解调器发送的一般信息
- dataResponseConfig (idModem, Time, text) // 从调制解调器收到的配置信息
- dataResponseReset (idModem, Time, text) // 重置从调制解调器收到的结果
- queueSmsLog (idModem, Time, text) // SMS 发送到调制解调器
我需要从用户的调制解调器发出信息。我选择调制解调器并从表中粘贴最后的响应(在列 ( Time ) 中排序并设置限制 1):general ( data )、config ( dataResponseConfig )、reset ( dataResponseReset ) 和 smsLog ( queueSmsLog )。一切正常,直到任何表中都没有相同的时间值(Time)。有重复项。我正在使用这个查询。我觉得问题出在请求的最后,但是没有足够的知识来解决它。
SELECT gM.nameGroup as nameGroup, mI.infoText, qSL.Time, qSL.text,
dRC.Time ,dRR.Time, data.Time, data.text
FROM groupModems gM
left outer JOIN modemsInfo mI ON mI.idUser = gM.idUser AND mI.idGroup = gM.id
left outer JOIN data ON mI.id = data.idModem
left outer JOIN queueSmsLog qSL ON mI.id = qSL.idModem
left outer JOIN dataResponseConfig dRC ON mI.id = dRC.idModem
left outer JOIN dataResponseReset dRR ON mI.id = dRR.idModem
WHERE gM.idUser = :user_id
AND (data.Time = (SELECT `Time`
FROM data
WHERE mI.id = data.idModem
ORDER BY `Time` DESC
LIMIT 1)
OR data.Time IS NULL)
AND (dRC.Time = (SELECT `Time`
FROM dataResponseConfig
WHERE mI.id = dataResponseConfig.idModem
ORDER BY `Time` DESC
LIMIT 1)
OR dRC.Time IS NULL)
AND (dRR.Time = (SELECT `Time`
FROM dataResponseReset
WHERE mI.id = dataResponseReset.idModem
ORDER BY `Time` DESC
LIMIT 1)
OR dRR.Time IS NULL)
AND (qSL.Time = (SELECT `Time`
FROM queueSmsLog
WHERE mI.id = queueSmsLog.idModem
ORDER BY id DESC
LIMIT 1)
OR qSL.Time IS NULL)
IS NULL - 用于万一在调制解调器响应的表中根本没有信息
如果我们假设像 dataResponseConfig 这样的表有自己的记录 ID(如果没有它们,如果突然没有,则添加),那么就会出现这样的事情:
PS 如果一切都与问题中描述的表结构完全一样,并且没有 id 列,那么应该添加它,如果没有明确的唯一性,处理记录是非常困难的。这里当然有选项可以拉出类似这样的东西
select max(concat(привести_к_строке(Time), text)) ...
,然后将组合的字符串解析回时间和文本,但这看起来很麻烦,一点也不方便。