我有3个表,members
,teams
和team_members
。team_members
容纳members
和teams
的ID,并按行存储它们。team_members
表的架构: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进一步了解该功能。如果这样做,您可以摆脱foreach
和explode
,因为$row['team_members']
将为每个成员建立一个换行符。关于mysql - 通过SQL JOINS获取每个团队的成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41663574/