获取与用户

时间:2016-04-25 10:27:18

标签: php mysql json

我正在尝试使用两个表中的数据创建一个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,
        );

我怎样才能做到这一点? 我需要一会儿吗?

5 个答案:

答案 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.idmessages.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;

这样效率更高,因为它使用一个查询来获取您需要的所有数据,并且随着您网站的增长,它可能需要稍微调整一下。