这是一个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`";
答案 0 :(得分:0)
您的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注入漏洞。你应该解决这个问题。