这是一个PDO查询。尽管使用GROUP BY,我仍然得到重复的结果。去联盟时过滤重复结果
第一个表table1包含一个包含TG组的条目列表。
第二个表table2链接回一个表,其中列出了与查询的网络关联的所有组TG。有时在两个表中有重复的条目,除了“访问”值。所有其他的SELECT数据都是一样的。我想从访问值不同的同一组TG的DMR_Networks表中过滤掉所有条目。来自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列上的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`";
谢谢。有效! – Garrett
就SQL注入问题而言,$ row_network ['Network']直接来自我在页面上运行的查询的结果。这不安全吗?我遇到的问题是绑定变量的数量有误,因为它没有在两个查询中使用。 – Garrett
假设这是创建“网络”事件时提交的某个表单字段的值,那么有人可以在其中输入一个特殊值,这会在您的发布代码中触发SQL注入。所以不,你的发布代码不一定是安全的,即使值直接来自数据库本身。 – user268396