使用php和mysql从表联接中获取数据

使用php和mysql从表联接中获取数据,php,mysql,Php,Mysql,我的数据库中有以下表格: CREATE TABLE subjects ( subject_id int(11) NOT NULL AUTO_INCREMENT, subject text, PRIMARY KEY (subject_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1; CREATE TABLE users ( id int(11) NOT NULL AUTO_INCREMENT PRIMARY

我的数据库中有以下表格:

CREATE TABLE subjects (
  subject_id int(11) NOT NULL AUTO_INCREMENT,
  subject text,
  PRIMARY KEY (subject_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1;

CREATE TABLE users (
  id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  username varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE users_subjects (
  users_subjects_id int(11) NOT NULL AUTO_INCREMENT,
  user_id_fk int(11),
  subject_id_fk int(11),
  FOREIGN KEY(user_id_fk) REFERENCES users(id),
  FOREIGN KEY(subject_id_fk) REFERENCES subjects(subject_id),
  PRIMARY KEY (users_subjects_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1;
在“用户\主题”表中,我将“主题”和“用户”表关联起来

所有的表数据都是从PHP引入的,当引入
用户
主题
时,将创建“
用户_主题
”表

例如,如果我输入一个名为'example'且ID=1的用户,以及ID为1和2的SAT和ICT科目,“
users\u subjects
”表将类似于以下内容:

问题是,我试图在PHP表中向用户显示其相应的主题,但我不知道如何在“主题”列中显示以逗号分隔的主题。我想做一些类似下图的事情。有人能帮我吗?多谢各位

这是我代码中的内容:

 <table class="users">
    <tr>
        <th colspan="2"><h2>USERS</h2></th>
    </tr>
    <tr>
        <th> NAME </th>
        <th> SUBJECTS </th>
    </tr>

<?php
$sql = "SELECT * FROM users WHERE rol='profesor'"; 
$result = $conn->query($sql); if ($result->num_rows==0){

    echo 'No users';
}else{
while($row = $result->fetch_assoc()) {


     $subjects = "";
        $sql2 = "SELECT user_id_fk, GROUP_CONCAT(subject_id_fk SEPARATOR ',') FROM users_subjects WHERE user_id_fk='$id' GROUP BY user_id_fk;";

        /*$sql2 = "SELECT user_id_fk, GROUP_CONCAT(subject_id_fk SEPARATOR ',') FROM users_subjects where user_id_fk='$id'";*/


        $result2 = $conn->query($sql2);
        while ($row2 = $result2->fetch_assoc()) {
            $subjects = $row2["subject"];
        }

        echo "<tr>
                  <td>".$row["username"]."</td>
                  <td>".$subjects."</td></tr>";
    }
}
?>
</table>

使用者
名称
学科

您需要的查询必须涉及分组才能使用
GROUP\u CONCAT

SELECT user_id_fk, GROUP_CONCAT(subject_id_fk SEPARATOR ',')
  FROM users_subjects
  WHERE user_id_fk=?
  GROUP BY user_id_fk
如果您想获得这些名称,您需要加入

SELECT users.username, GROUP_CONCAT(subjects.subject SEPARATOR ',')
  FROM users_subjects
  RIGHT JOIN users ON users.id=users_subjects.user_id_fk
  RIGHT JOIN subjects ON subjects.subject_id=users_subjects.subject_id_fk
  WHERE user_id_fk=?
  GROUP BY user_id_fk

看看GROUP_CONCAT函数如果你有MyISAM表,你真的应该把它们移到InnoDB。同样,除非您有非常令人信服的理由,否则请使用
utf8mb4
而不是严格的8位
latin1
字符编码。@tadman感谢您的评论,我刚刚将引擎类型更改为InnoDB,使用
ALTER TABLE users\u subjects Engine=InnoDB也不要忘记字符编码,否则您将无法处理非拉丁字符或表情符号@塔德曼:当然!我用
altertableusers\u主题转换为字符集utf8mb4再次更改了它谢谢。关于使用
参数化查询
bind_param
我正在做,但首先我试图让代码工作我编辑了代码,你是说这样?但是仍然不起作用对不起:也许你可以更详细地解释你遇到的问题显示的地方:
注意:未定义索引:subject
我更改了许多内容,但仍然得到相同的错误您将得到的唯一值是您特别要求的值。如果你
选择x,y
你将不会神奇地得到
z
。使用
var\u dump
可以确定,但一般来说,每一列都有一个基于生成查询的名称。在这种情况下,你可能需要做
GROUP_CONCAT(…)作为受试者
来给它一个更简短的名字。谢谢,我会试试你说的。我试过用
GROUP_CONCAT(…)作为主题
,至少它没有给我未定义索引的错误:subject,现在它在所有行中显示数字13,这是非常罕见的。