php mysql Я лоток для присоединения к 3 столам, но показывает дублированный результат - PullRequest
0 голосов
/ 05 августа 2020

У меня 3 табеля

notifications

not_id    |     not_name    
-------------------------
  2       |   Notification Name 01  
  3       |   Notification Name 02      
  4       |   Notification Name 03  

groups

group_id      |     group_name  
-------------------------
  4       |   group name 1  
  5       |   group name 2      

group_not

---------------------------
group_not_id |  group_id |  not_id  
---------------------------
     1       |     4     |      2   
     2       |     4     |      3   
     3       |     5     |      4   

I хотите показать все уведомления, относящиеся к группе, у которой group_id = 4

, но сторона php дублируется, как показано ниже:

Notification Name
Notification Name 01    
Notification Name 01    
Notification Name 02    
Notification Name 02

MYSQL код

function getRows_not_group($group_id)
{ 
    global $conn;
$sql = "SELECT group_not.group_not_id, notifications.not_name, groups.group_name FROM group_not JOIN groups ON group_not.group_id = $group_id JOIN notifications ON group_not.not_id = notifications.not_id WHERE group_not.group_id = $group_id";
    $result = mysqli_query($conn, $sql);
    if(!$result)
    {
        echo mysqli_error($conn);
    }
    $rows = [];
    if(mysqli_num_rows($result) > 0)
    {
        while ($row = mysqli_fetch_assoc($result)) 
        {
            $rows[] = $row;
        }
    }
   return $rows;
}

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

Я предлагаю вам использовать SELECT DISTINCT КАК НИЖЕ:

SELECT DISTINCT group_not.group_not_id, notifications.not_name, groups.group_name FROM group_not JOIN groups ON group_not.group_id = $group_id JOIN notifications ON group_not.not_id = notifications.not_id WHERE group_not.group_id = $group_id";

Оператор SELECT DISTINCT используется для возврата только отдельных (разных) значений.

0 голосов
/ 05 августа 2020

Условие соединения, которое приводит к таблице groups, должно быть исправлено.

У вас есть:

SELECT ...
FROM group_not 
JOIN groups ON group_not.group_id = $group_id   --> here
JOIN notifications ON group_not.not_id = notifications.not_id 
WHERE group_not.group_id = $group_id

Хотя вам действительно нужно:

JOIN groups ON group_not.group_id = groups.group_id

Я бы также рекомендовал использовать псевдонимы таблиц, чтобы упростить чтение и запись запроса. Вам также следует использовать параметризованный запрос, а не объединять переменную в строке запроса. Итак:

SELECT gn.group_not_id, n.not_name, g.group_name 
FROM group_not gn 
INNER JOIN groups g ON gn.group_id = g.group_id
JOIN notifications ON gn.not_id = n.not_id 
WHERE gn.group_id = ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...