2017-01-02 5 views
0

Это запрос 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`"; 
+0

спасибо. Это сработало! – Garrett

+0

Что касается проблемы с SQL Injection, эта строка $ 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 ...

Также, как написано, у вас есть простая и неприкрытая уязвимость в SQL-инъекции в вашем разряде WHERE table2.Network = '".$row_network['Network']."'. Вероятно, вы должны это исправить.

Смежные вопросы