php mysql高级选择

时间:2010-12-09 13:35:04

标签: php mysql select

表1 =事件 - >持有一系列事件

表2 =回复 - >持有用户列表的响应具有与事件表相对应的eid的外键

我需要将这些表连接在一起,以便它可以在php上返回类似于此的数组。

array(
  0 => array(
      'title' =>'',                      //title of events table
      'contents' =>'this is a demo',     //contents of events table
      'users' => array(                  //users comes from response table
           0 = array(
             'firstname'=>'John',
           ),
           1 = array(
             'firstname'=>'James',
           )
      )
  )
);

这可以吗?仅使用mysql?因为我知道你可以在php上做到这一点。

4 个答案:

答案 0 :(得分:2)

您可以使用单个JOIN查询收集MySQL中的所有必要数据。

但是,默认情况下,PHP不会像您的示例那样返回数组。您必须遍历查询结果集并自己创建这样的数组。

答案 1 :(得分:1)

我很确定答案是否定的,因为mysql总是会返回一个“平面”结果集。因此,您可以使用以下方法获取所有结果:

SELECT e.title, e.contents, r.firstname 
FROM events e LEFT JOIN response r ON e.id = r.eid
ORDER BY e.id, r.id

然后使用php将其按摩到数组中,但我想这就是你正在做的事情。

编辑:

顺便说一句,如果您想为每个事件添加1行,则可以使用GROUP_CONCAT

SELECT e.title, e.contents, GROUP_CONCAT(DISTINCT r.firstname ORDER BY r.firstname SEPARATOR ',') as users
FROM events e LEFT JOIN response r ON e.id = r.eid
GROUP BY e.id

答案 2 :(得分:0)

正如Jason McCreary所说。为方便起见,这里是您需要的查询(尽管字段名称可能与您的数据库结构不匹配,因为您没有提供此信息)

SELECT 
  * 
FROM
  events
LEFT JOIN
  responses ON (events.id = responses.eid)

答案 3 :(得分:0)

SQL是:

SELECT events.id, events.title, events.contents,
       response.id AS rid, response.firstname
FROM events LEFT JOIN response
     ON events.id = response.eid

我想我会告诉你如何按照你的意愿按照结果按下结果:

$query = "SELECT events.id, events.title, events.contents, response.id AS rid, response.firstname
          FROM events LEFT JOIN response ON events.id = response.eid";

$result = mysql_query($query);

$events = array();
while ($record = mysql_fetch_assoc($result)) {
  if (!array_key_exists($record['id'], $events)) {
    $events[$record['id']] = array('title' => $record['title'], 'contents' => $record['contents'], 'users' => array());
  }

  if ($record['rid'] !== NULL) {
    $events[$record['id']]['users'][$record['rid']] = array('firstname' => $record['firstname']);
  }
}

mysql_free_result($result);