去联盟时过滤重复的结果

时间:2017-01-02 19:15:55

标签: php mysql pdo union

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

1 个答案:

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