繁体   English   中英

通过SQL左联接在另一个左联接上的顺序

[英]Order by a SQL left join on another left join

我正在尝试使用join来获取3个不同表中的某些列。 我以直观的方式展示了如何在SQL语句中连接表。 我希望通过role_level表中的role_level对结果进行rl.level_priority

FROM users u LEFT JOIN
                user_roles ur
                ON u.id = ur.user_id LEFT JOIN
                role_level rl
                ON ur.role_level_id = rl.id AND ur.role_id = ?
                WHERE (u.id = ?) AND (u.group_id <= ?) AND (u.db_isdeleted is null)
                GROUP BY u.id, u.fullname, u.image_thumb, u.group_id
                ORDER BY rl.level_priority

我正在努力查看是否正确执行此操作。 我得到结果,但是就rl.level_priority而言,它们的排序没有上升

左联接左联接

整个代码在这里:

while($stmt_two->fetch()){
                // HIGHEST USER ROLE DISPLAYED - ACTIVE (6), LESS ACTIVE(7), PASSIVE (9)
                $db_user_group_id = 7;
                // DISPLAY USERS WITH A SET JOB POSITION
                $sql_three = <<< EOF
                SELECT u.id, u.fullname, u.image_thumb, u.group_id, MIN(rl.level_priority)
                FROM users u LEFT JOIN
                user_roles ur
                ON u.id = ur.user_id LEFT JOIN
                role_level rl
                ON ur.role_level_id = rl.id AND ur.role_id = ?
                WHERE (u.id = ?) AND (u.group_id <= ?) AND (u.db_isdeleted is null)
                GROUP BY u.id, u.fullname, u.image_thumb, u.group_id
                ORDER BY rl.level_priority;
EOF;
                $stmt_three = $mysqli->prepare($sql_three) or die ("Feil i database<br>" . $sql . "<br><b>Feilmelding:</b> " . $mysqli->error);
                $stmt_three->bind_param("iii",$db_user_role_id, $db_user_group_id, $db_role_id);
                $stmt_three->execute();
                $stmt_three->store_result();
                $stmt_three->bind_result($db_id_role, $db_fullname_role, $db_image_thumb_role, $db_group_id, $db_level_priority);
                $results_users_role = $stmt_three->num_rows;
                $results += $results_users_role;

                if (!$results_users_role == 0) {
                    while($stmt_three->fetch()) {
                        $body_html .= "<tr>";
                        if (!empty($db_image_thumb_role)) {
                            $body_html .= "<td><img src=\"data:image/jpeg;base64," . base64_encode($db_image_thumb_role) . "\"/></td>\n";
                        }
                        else {
                            $body_html .= "<td><img src=\"img/anonymous-user-thumb.png\"></td>";
                        }

                        $body_html .= "<td><a href=user.php?u=" . $db_id_role . ">" . $db_fullname_role . "</a></td></tr>";
                    }
                }
                $stmt_three->close();
            }

这是您的查询:

SELECT u.id, u.fullname, u.image_thumb, u.group_id, MIN(rl.level_priority)
FROM users u LEFT JOIN
     user_roles ur
     ON u.id = ur.user_id LEFT JOIN
     role_level rl
     ON ur.role_level_id = rl.id
WHERE (u.id = ?) AND (u.group_id <= ?) AND (u.db_isdeleted is null) AND
      ur.role_id = ?
GROUP BY rl.level_priority;

您的WHERE子句正在撤消LEFT JOIN (即,将其转换为INNER JOIN ),因为ur.role_id对于不匹配ur.role_id将为NULL 如果您确实需要LEFT JOIN ,则将此条件移至ON子句。

其次,您有GROUP BY子句,但是那里有错误的列。 正确的列是不在聚合函数中的列。 最后,您需要一个ORDER BY

所以:

SELECT u.id, u.fullname, u.image_thumb, u.group_id, MIN(rl.level_priority)
FROM users u LEFT JOIN
     user_roles ur
     ON u.id = ur.user_id LEFT JOIN
     role_level rl
     ON ur.role_level_id = rl.id AND ur.role_id = ?
WHERE (u.id = ?) AND (u.group_id <= ?) AND (u.db_isdeleted is null) 
GROUP BY u.id, u.fullname, u.image_thumb, u.group_id
ORDER BY rl.level_priority;

试试这个

SELECT u.id, u.fullname, u.image_thumb, u.group_id, ur.role_level, MIN(rl.level_priority)
FROM users u
  LEFT JOIN user_roles ur ON u.id = ur.user_id
  LEFT JOIN role_level rl ON ur.role_level_id = rl.id
WHERE ((u.id = ?) AND (u.group_id <= ?) AND (u.db_isdeleted is null)) AND
ur.role_id = ?
GROUP BY rl.level_priority
order by rl.level_priority

试试这个:

SELECT u.id, u.fullname, u.image_thumb, u.group_id, ur.role_level, MIN(rl.level_priority)
FROM users u
  LEFT JOIN user_roles ur ON u.id = ur.user_id
  LEFT JOIN role_level rl ON ur.role_level_id = rl.id
WHERE ((u.id = ?) AND (u.group_id <= ?) AND (u.db_isdeleted is null)) AND ur.role_id = ?
GROUP BY rl.level_priority
order by MIN(rl.level_priority)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM