Это запрос PDO. Я получаю дубликат результата, несмотря на использование GROUP BY.Фильтрация дубликатов результатов при переходе на союз
Первая таблица, таблица1, содержит список записей, содержащих группу TG.
Вторая таблица, таблица2, ссылается на таблицу, в которой перечислены все группы TG, связанные с запрошенной сетью. Иногда в двух таблицах EXCEPT есть двойные записи для значения «доступ». Все остальные данные SELECT совпадают. Я хочу отфильтровать все записи из таблицы DMR_Networks с той же группой TG, где значение доступа отличается. значение, полученное из таблицы DMR_repeater_links, выигрывает при возникновении конфликта.
table3 - это нормализованная таблица, в которой перечислены все возможные TG, но значение доступа остается в таблице1 и таблице2.
Вот мой запрос:
$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)) {
Результат возвращает дубликат ТГ, поскольку значение доступа отличается. Я не могу понять, как изолировать значение DISTINCT в столбце TG или как GROUP BY в столбце TG по всему запросу.
Я попытался
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 Injection, эта строка $ row_network ['Network'] поступает непосредственно из результатов запроса, который я запускал на странице. Разве это не безопасно? Проблема, с которой я столкнулась, - это ошибка с числом связанных переменных, поскольку она не используется в обоих запросах. – Garrett
Скажите, что значение какого-то поля формы отправляется при создании «Сети», тогда кто-то может ввести специально созданное значение, которое вызовет SQL-инъекцию в вашем опубликованном коде. Так что нет, ваш опубликованный код не обязательно безопасен, даже если значение приходит непосредственно из самой базы данных. – user268396