2017-01-02 61 views
0

这是一个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`"; 
+0

谢谢。有效! – Garrett

+0

就SQL注入问题而言,$ row_network ['Network']直接来自我在页面上运行的查询的结果。这不安全吗?我遇到的问题是绑定变量的数量有误,因为它没有在两个查询中使用。 – Garrett

+0

假设这是创建“网络”事件时提交的某个表单字段的值,那么有人可以在其中输入一个特殊值,这会在您的发布代码中触发SQL注入。所以不,你的发布代码不一定是安全的,即使值直接来自数据库本身。 – user268396

回答

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注入漏洞。你应该解决这个问题。