2015-09-25 99 views
0

我试图使用连接来获取3个不同表中的某些列。我做了一个视觉表示,展示了我的SQL语句中表连接的方式。我希望通过role_level表中的rl.level_priority来排序结果。通过SQL排序左连接另一个左连接

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

Left joining a left join

整个代码的问候排序上升是在这里:

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(); 
      } 
+0

移动ur.role_id条件JOIN的行为。 (现在它作为内部连接执行...) – jarlh

+0

选择你正在分组的BY的MIN并不会有很大的意义。 – Strawberry

+0

为什么MIN(rl.level_priority)与GROUP BY rl.level_priority结合?这与你想要做的事情相反。一般的GROUP BY规则说:如果指定了GROUP BY子句,SELECT列表中的每个列引用必须标识一个分组列或者是一个set函数的参数。 – jarlh

回答

1

这是您的查询:

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_idNULL非匹配。如果您确实需要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; 
+0

工作!谢谢 :) – PhyCoMath

0

试试这个

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 
+0

当rl.level_priority用作聚合函数的参数时,为什么GROUP BY为rl.level_priority? – jarlh

+0

仍然一样。 – PhyCoMath

0

试试这个:

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) 
+0

SELECT role_id,role_name FROM roles WHERE role_name LIKE? AND(is_deleted!= 1或is_deleted为空) 错误:无法使用组功能 – PhyCoMath