从2个不使用php mysql的表中选择

时间:2016-08-13 11:00:56

标签: php mysql

我有两个具有以下结构的不同表:

grouprel

id | userId | pupID |的groupId

学生

id | userId | fname | L-NAME

puplrel中的pupId等于学生中的id。

我想从另一个小组中取出学生,然后按fname,lname命令。

现在我有两个这样的问题:

$q = "SELECT * FROM grouprel WHERE userid = ". $userid ." AND groupId = ". $_GET['id'] ."";
$r = mysqli_query($mysqli, $q);

while ($rows = mysqli_fetch_object($r)) {
    $query = "SELECT id, fname, lname FROM pupils WHERE userid = ". $userid ." AND id = ". $rows->pupId ." AND status = 0 ORDER BY fname, lname";
    $result = mysqli_query($mysqli, $query);

    while($row = mysqli_fetch_object($result)) {
        echo stuff...           
    }
}

这样可行,但它没有像我想的那样按字母顺序排列名称。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

这是在第一个查询上迭代:

while ($rows = mysqli_fetch_object($r)) {

这会迭代第二个查询的每个实例:

while($row = mysqli_fetch_object($result)) {

因此,如果第一个查询返回1,2,3,并且第二个查询的每次迭代都返回A,B,那么您的输出将是:

1 A
1 B
2 A
2 B
3 A
3 B

第二个查询是按照您提供的ORDER BY子句排序。但是按第一个查询排序整个输出的。

最终,为什么你需要这些单独的查询?在循环中执行数据库查询 几乎总是错误的想法。看起来你需要的只是一个查询,只有一个简单的JOIN。猜测你的逻辑,像这样:

SELECT
  pupils.id, pupils.fname, pupils.lname
FROM
  pupils
  INNER JOIN grouprel ON pupils.id = grouprel.pupId
WHERE
  pupils.userid = ?
  AND grouprel.groupId = ?
  AND pupils.status = 0
ORDER BY
  fname, lname

可能需要稍微调整才能完全匹配您所寻找的内容,但您可以通过单个查询而不是多个单独的查询来实现目标。然后,该查询的结果将按照您告诉MySQL订购它们的方式进行排序,而不是您告诉PHP订购它们的方式。