php - 加入联盟时过滤重复结果

标签 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`";

最佳答案

您的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/

相关文章:

php - Magento 2 的产品图片和缩略图显示行为

php - 如何使用 PHP 向用户发送每日电子邮件通知?

php - 将脚本查询简化为单个查询

php - 使用 like 子句执行准备好的 PDO 语句

php - 将 PK 分配给链接

php - PDO MySQL 如何处理预处理语句中的参数?

php - 将文本字符串中的任何 url 替换为带有 php 的可点击链接

php - 我在哪里可以找到一个 UTF8 位到字符表以将例如 "ñ"转换为 "ñ"?

mysql - 在数据库中存储和保存玩家背包(库存)

mysql - 扩展 ruby​​、activerecord、mysql 应用程序