这是一个 PDO 查询。尽管使用了 GROUP BY,但我还是得到了重复的结果。
第一个表 table1 包含包含组 TG 的条目列表。
第二个表 table2 链接回一个表,该表列出了与所查询的网络关联的所有组 TG。有时,除了“访问”值之外,两个表中存在重复的条目。所有其他 SELECT 数据都是相同的。我想过滤掉 DMR_Networks 表中具有相同组 TG 且访问值不同的所有条目。当存在冲突时,来自 DMR_repeater_links 表的值获胜。
table3 是标准化表,列出了所有可能的 TG,但访问值仍保留在 table1 和 table2 中。
这是我的查询:
$SQL="SELECT table3.`TG`,
TS,
table3.`assignment`,
`access`
FROM table1
INNER JOIN table3 on table1.RB_TG_ID = table3.RB_TG_ID
WHERE `state_ID`=:state_id
AND `rpt_ID`=:ID
GROUP BY table3.`TG`
UNION
SELECT table3.`TG`,
TS,
table3.`assignment`,
`FP` as `access`
FROM table2
INNER JOIN table2
ON table2.RB_TG_ID = table3.RB_TG_ID
WHERE table2.Network = '".$row_network['Network']."'
GROUP BY table3.`TG`
ORDER BY `TS`, `TG`";
WHILE ($row_talk_groups = $link_DMR->fetch(PDO::FETCH_ASSOC)) {
由于访问值不同,结果返回重复的TG。我不知道如何隔离 TG 列上的 DISTINCT 值或如何在整个查询中对 TG 列进行 GROUP BY。
我试过了
WHILE ($row_talk_groups = $link_DMR->fetchAll(PDO::FETCH_GROUP)) {
但是,它无法显示任何结果。
这是最终有效的查询:
$SQL="SELECT unionResult.TG, unionResult.TS, unionResult.assignment, unionResult.access
FROM
(SELECT table3.`TG`, `TS`, table3.`assignment`, `access`
FROM table1
INNER JOIN `table3` on table1.RB_TG_ID = table3.RB_TG_ID
WHERE `state_ID`=:state_id AND `rpt_ID`=:ID
UNION SELECT DISTINCT table3.TG, TS, table3.`assignment`, `FP` as `access`
FROM table2
INNER JOIN `table3` on DMR_Networks.RB_TG_ID = table3.RB_TG_ID
WHERE table2.Network = '".$row_network['Network']."')
AS unionResult GROUP BY `TG`";
最佳答案
您的GROUP BY
等仅适用于 UNION
的第二个分量结果集(即右手部分)。它不适用于UNION
作为一个整体。
使用括号和子查询;类似:SELECT DISTINCT unionResult.TG, unionResult.TS, unionResult.assignment, unionResult.access FROM (<your subquery here>) AS unionResult GROUP BY ...
正如所写,您的 WHERE table2.Network = '".$row_network['Network']."'
中存在一个简单且朴实的 SQL 注入(inject)漏洞。少量。你也许应该解决这个问题。
关于php - 加入联盟时过滤重复结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41432196/