2017-01-02 25 views
0

これはPDOクエリです。私はGROUP BYを使用しても重複した結果を得ています。連合に行くときに重複結果をフィルタリングする

最初のテーブルtable1には、グループTGを含むエントリのリストが含まれています。

第2のテーブルtable2は、照会されたネットワークに関連付けられたすべてのグループTGを一覧表示するテーブルにリンクしています。 2つのテーブルに「アクセス」値を除いて重複したエントリがあることがあります。他のすべての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を返します。

は、ここに私のクエリです。 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インジェクションをトリガーする特別に細工された値を誰かが入力する可能性があります。そうではありません。たとえ値がDB自体から直接来ても、投稿されたコードは必ずしも安全であるとは限りません。 – 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インジェクションの脆弱性が存在します。おそらくそれを修正すべきです。

関連する問題