表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上做到这一点。
答案 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);