2015-09-25 106 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