これは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`";
ありがとうございます。出来た! – Garrett
SQLインジェクションの問題に関しては、$ row_network ['Network']はページ上で実行したクエリの結果から直接来ています。それは安全ではないですか?私はそれが両方のクエリで使用されていないので、バインドされた変数の数のエラーです。 – Garrett
「ネットワーク」を作成するときに提出されるフォームフィールドの値であるとすれば、投稿されたコードにSQLインジェクションをトリガーする特別に細工された値を誰かが入力する可能性があります。そうではありません。たとえ値がDB自体から直接来ても、投稿されたコードは必ずしも安全であるとは限りません。 – user268396