我正在尝试使用两个表中的数据创建一个json对象
表1包含用户信息
ID
命名
用户名
电子邮件
表2保存给用户的消息
ID
F_ID
消息
日期
到目前为止一切顺利。我已经设法用LEFT JOIN
做到了这一点 $sql = "SELECT * FROM user LEFT JOIN messages ON user.id = messages.f_id
$result = mysqli_query($conn, $sql) or die(mysql_error());
while ($data = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
$messages[] = array(
'users' => array(
'Id' => $data['id'],
'Name' => $data['name'],
'Username' => $data['username'],
'Email' => $data['email'],
),
'messages' => array(
'f_id' => $data['f_id'],
'message' => $data['message'],
'date' => $data['date'],
);
);
}
但问题/挑战是它只从messages表返回一行,即使有多行与用户相关。
这就是我想要实现的目标
'user' => array(
'id' => 1,
'name' => John Doe,
'username' => Johndoe,
'email' => johndoe@mail.com,
),
'messages' => array(
'id' => 1,
'f_id' => 1,
'message' => 'Just a test',
'date' => 14-08-2014,
'id' => 2,
'f_id' => 1,
'message' => 'Just a test 1',
'date' => 12-08-2014,
);
我怎样才能做到这一点? 我需要一会儿吗?
答案 0 :(得分:0)
您可以通过两种方式实现:
1)仅查询用户,然后迭代它们并查询每个用户的消息。这意味着您将查询数据库N + 1次,其中N是用户数。
2)查询与用户(而不是相反)加入的消息,这将导致大量“未使用”的数据,但只有一个查询。
答案 1 :(得分:0)
尝试:
SELECT
user.id AS user_id, user.name, user.email, user.username,
messages.id AS message_id, messages.f_id, messages.message, messages.date
FROM user, messages
LEFT JOIN messages ON user.id = messages.f_id
请注意,user.id
和messages.id
需要别名,因为两个列名都相同。
答案 2 :(得分:0)
请更新您的SQL查询
$sql = "SELECT * FROM user Right JOIN messages ON user.id = messages.f_id
或
$sql = "SELECT * FROM messages LEFT JOIN user ON user.id = messages.f_id
答案 3 :(得分:0)
您可以尝试:
SELECT * FROM messages LEFT JOIN user ON user.id = messages.f_id
它将获取用户的所有消息,但如果用户没有消息,您将无法通过此类查询获取消息。
答案 4 :(得分:0)
可能发生的情况是,当您在users表上运行查询时,它将使用该表的主键来确保没有“重复”数据(应该如此)。你有两个选择:
这可能有点慢,因为您将多次查询数据库。你可以做点什么
SELECT * FROM users;
然后迭代用户结果并对消息运行查询
SELECT * FROM messages WHERE f_id = <user_id>;
这有什么问题?您拥有的用户越多,浪费就越多,而且网站的执行速度也会越慢。不推荐。
对邮件而不是用户运行此查询。它将使用消息表的主键(将是id)来确定什么是重复。
SELECT * FROM messages LEFT JOIN users ON users.id = messages.f_id;
这样效率更高,因为它使用一个查询来获取您需要的所有数据,并且随着您网站的增长,它可能需要稍微调整一下。