【问题标题】:Is it possible to do this query in mysql?是否可以在 mysql 中执行此查询?
【发布时间】:2012-05-13 01:57:22
【问题描述】:

假设我有一个名为 students 的表,其中包含所有学生的列表。每个学生可以有许多课程存储在另一个表中,由学生 ID 标识。

我想做一个查询,该查询将从学生表中获取包含学生信息的行,并在一个查询中获取他的所有课程。我想要的输出是这样的:

Array
(
    [0] => Array
        (
            [id] => 5
            [firstName] => Bob
            [lastName] => Smith
            [email] => ....
            [courses] => Array
                (
                    [0] => Array
                        (
                            [id] => 30
                            [name] => Test Course
                            [price] => 400
                        )

                    [1] => Array
                        (
                            [id] => 30
                            [name] => Test Course 2
                            [price] => 300
                        )

                )

        )

)

要获取学生的信息,我会执行以下查询:

SELECT * FROM students WHERE something ='something'

要为学生获取课程,我会这样做:

SELECT * FROM courses WHERE studentId = '5'

是否可以同时执行两个查询并获得类似上述数组的输出,还是我必须遍历每个学生并获取其课程,然后手动将其附加到数组?

【问题讨论】:

标签: mysql sql database


【解决方案1】:
$query = "select * from students inner join courses on studentID = '5' where something  = 'something'"; 
$result = mysql_db_query ($dbname, $query, $link); 
$id = $row[0]; # corresponding to row in students database
$firstName= $row[1]; # corresponding to row in students database
$lastName = $row[2]; # corresponding to row in students database
$email = $row[3]; # corresponding to row in students database
while($row = mysql_fetch_array($result)) {
  echo 'id: '.$row[id];
  echo '<br>';
  echo 'name: '.$row[name];
  echo '<br>';
  echo 'price: '.$row[price];
  echo '<br>';
}

【讨论】:

  • 是否可以使用inner join courses on studentId = students.id 而不是将学生 ID 硬编码为 5?我想招收所有学生,而不是一次一个。
  • @Click Yes 只需将 '5' 替换为 '".$studentId."'
  • 不,那么我仍然会一次为一个学生获取它,如果我有 100 个学生,我将不得不为所有学生运行此查询 100 次
  • @clickupvote 您可以为所有学生执行此操作,但不能在一个查询中完成。这将需要两个查询。基本上只需使用 select * from students 在上面添加另一个 while 循环。
【解决方案2】:

您可以通过将表格连接在一起来做到这一点:

select s.*, c.*
from students s join
     courses c
     on s.studentid = c.studentid
where s.something = 'something'

如果您希望学生信息在一行,课程在另一行,那么这是不可能的。所有行必须具有相同的列。

【讨论】:

  • 我希望课程信息是学生行上的一个数组,那不可以吗?
  • 这不会创建多维数组。
  • @Strawberry 除了循环之外,不可能做一个多维数组?
  • @ClickUpvote 我不确定。我也在等一个答案。我知道如果您确定使用 PHP 处理它,它可以完成。我的猜测是否定的,但我有希望。 CakePHP 是这样做的,也许你可以挖掘一下他们的代码:D
【解决方案3】:

基本上新代码是:

$query = "select * from students"; 
$result = mysql_db_query ($dbname, $query, $link); 
while($row = mysql_fetch_array($result)) {
   $id = $row[0]; # corresponding to row in students database
   $firstName= $row[1]; # corresponding to row in students database
   $lastName = $row[2]; # corresponding to row in students database
   $email = $row[3]; # corresponding to row in students database
   echo 'id: '.$id;
   echo '<br>';
   echo 'firstName: '.$firstName;
   echo ' ';
   echo 'lastName: '.$lastName;
   echo '<br>';
   echo 'email: '.$email;
   echo '<br>';
   $query = "select * from courses where id  = '".$id."'"; 
   $result2 = mysql_db_query ($dbname, $query, $link); 
   while($row2 = mysql_fetch_array($result2)) {
     echo 'name: '.$row2[1]; # corresponding to row in courses database
     echo '<br>';
     echo 'price: '.$row2[2]; # corresponding to row in courses database
     echo '<br>';
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多