2017-01-02 60 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注入漏洞。你應該解決這個問題。