我有3个表,membersteamsteam_members

team_members容纳membersteams的ID,并按行存储它们。

team_members表的架构:

mysql - 通过SQL JOINS获取每个团队的成员-LMLPHP

teams表:

我想做的是创建一个联接,在这里我可以从team_name表中输出teams,然后在netneth中显示与该团队相关的members_firstname。这样的例子:

Team 1
joe bloggs
jon doe

Team 2
charlie chaplin
hulk hogan


我的php代码如下所示:

<?php

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$sql = "SELECT t.team_name, group_concat(m.firstName)
        FROM members AS m
        JOIN team_members AS tm
        ON tm.member_id = m.member_id
        JOIN teams as t
        on t.team_id = tm.team_id
        GROUP BY t.teamname";

$result = $conn->query($sql);
    if($result->num_rows > 0){
        while($row = $result->fetch_assoc()){
            echo $row["member_id"] . '<br>';
            echo $row["team_id"] . '<br><br>';
        }
    }
?>


现在我得到:

注意:试图在第30行的-中获取非对象的属性是:

if($result->num_rows > 0){

最佳答案

您应该使用两个联接将三个表拼在一起。

SELECT t.team_name as team_name, group_concat(m.firstName) as team_members
FROM members AS m
JOIN team_members AS tm
ON tm.member_id = m.member_id
JOIN teams as t
on t.team_id = tm.team_id
GROUP BY t.team_name


然后,在尝试使用query之前,应先检查其状态。

if(!$result = $conn->query($sql)) {
     die(printf("Errormessage: %s\n", $conn->error));
}


然后遍历结果,并用逗号分割分组的值。

while($row = $result->fetch_assoc()){
      echo $row["team_name"] . '<br>';
      $names = explode(',', $row['team_members']);
      foreach($names as $name) {
           echo $name . '<br>';
       }
       echo '<br>';
}


您也可以使用<br>作为group_concat中的分隔符。您可以在此处http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat进一步了解该功能。如果这样做,您可以摆脱foreachexplode,因为$row['team_members']将为每个成员建立一个换行符。

关于mysql - 通过SQL JOINS获取每个团队的成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41663574/

10-13 06:45