Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何查询用户所有好友的帖子(存储在3个MySQL表之间)?_Php_Mysql_Mysqli_Inner Join - Fatal编程技术网

Php 如何查询用户所有好友的帖子(存储在3个MySQL表之间)?

Php 如何查询用户所有好友的帖子(存储在3个MySQL表之间)?,php,mysql,mysqli,inner-join,Php,Mysql,Mysqli,Inner Join,所以我有用户信息,用户发布的内容和朋友都在单独的表中 示例数据: 用户: 用户内容 id user_id date text 1 1 2015-09-12 00:24:08 content here 2 2 2015-09-11 00:24:08 more content here a 3 1 2015-09-10 00:24:0

所以我有用户信息,用户发布的内容和朋友都在单独的表中

示例数据:

用户:

用户内容

id    user_id      date                     text
1     1             2015-09-12 00:24:08     content here
2     2             2015-09-11 00:24:08     more content here a
3     1             2015-09-10 00:24:08     more content here b
4     3             2015-09-05 00:24:08     more content here c
朋友

id    user_id_1  user_id_2
1     1          2
2     2          3
3     2          4
user
表存储有关特定用户的信息,
user\u content
存储该用户发布的内容,
friends
存储用户之间的“friend”关联

我的问题是,我将如何查询这些数据以获得按日期排序的特定用户的所有朋友的用户内容?目前,我循环浏览特定用户的每个朋友:

$stmt = $mysqli->prepare("SELECT user_id_1, user_id_2 FROM friends WHERE user_id_1 = ? OR user_id_2 = ?");
$stmt->bind_param("ii", $userID, $userID);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($db_user_id_1, $db_user_id_2);
while ($stmt->fetch()) {
    //Work out which is the user, and which is the friend
    $friendID = $db_user_id_1;
    if ($userID == $db_user_id_1) {
        $friendID = $db_user_id_2;
    }

    //Load latest 10 user_content for each user, store in memory and sort by date
}
$stmt->close();

但是,在单个MySQL查询中是否可以实现这一点?在每个朋友之间循环然后按日期排序的开销似乎太大了。我只想为特定用户的所有朋友提供最新的30
user\u内容。

您需要的是
左加入

SELECT u.`username`, u.`email`, c.`text`, c.`date`
FROM user AS u
LEFT JOIN friends AS f ON f.`user_id_1` = u.`id`
LEFT JOIN user_content AS c ON c.`user_id` = f.`user_id_2`
WHERE u.`username` = 'userA'
ORDER BY c.`date` ASC
LIMIT 0,30

这将根据您的条件连接表
friends
user
user\u content

我没有完全理解你的目标

但以下是我获取一些
用户朋友的所有内容的方法:

更新如果您不确定哪个字段是
uder\u id
,哪个字段是
friend\u id
,您可以使用
对其进行转换:


从好友上的用户内容中选择,获取用户内容记录不属于当前用户但当前用户是好友之一的任何用户的所有内容。。。或者看看这个查询

编辑:忘记只为最后30篇文章添加限制

SELECT
     uc.user_id AS friend_user_id
    ,u.username AS friend_username
    ,u.email AS friend_email
    ,uc.date
    ,uc.text
FROM user_content uc
INNER JOIN friends f ON uc.user_id IN (f.user_id_1,f.user_id_2)
INNER JOIN user u ON uc.user_id = u.id
WHERE uc.user_id != ? AND ? IN (f.user_id_1, f.user_id2)
ORDER BY date DESC
LIMIT 30;

添加:您可以通过添加:
LEFT JOIN user AS uf ON f.`user\u id\u 2`=uf.`id`
before
WHERE
,并在
之前添加
,uf.`username` AS`friendname`
这似乎有两个问题。首先,它返回用户名“userA”,而不是朋友的用户名。其次,它假设朋友总是
user\u id\u 2
——朋友可能在
user\u id\u 1
中。这两个问题都有意义?请通读问题底部的工作示例,这正是我想要的-只是不是在单个查询中。您的意思是问题在于您的数据?哪个是不规范的?因此,您的
friend\u id
vs
user\u id
没有正确定义和调用
user\u id\u 1
user\u id\u 2
?不,我想显示用户所有朋友的内容。e、 g.如果我想要userA的朋友的所有内容-userA在
friends
表中是userB的朋友,所以在这种情况下我想显示userB发布的所有内容。这是我的问题-它与数据本身无关,而是如何在一个查询中提取数据。这实际上正是我的目标!万分感谢!
SELECT uc.*
FROM user_content uc
INNER JOIN friends f
ON f.user_id_2 = uc.user_id
  AND f.user_id_1 = ?
SELECT uc.*
FROM user_content uc
INNER JOIN friends f
ON (f.user_id_2 = uc.user_id
  AND f.user_id_1 = ?)
  OR (f.user_id_1 = uc.user_id
  AND f.user_id_2 = ?)
SELECT
     uc.user_id AS friend_user_id
    ,u.username AS friend_username
    ,u.email AS friend_email
    ,uc.date
    ,uc.text
FROM user_content uc
INNER JOIN friends f ON uc.user_id IN (f.user_id_1,f.user_id_2)
INNER JOIN user u ON uc.user_id = u.id
WHERE uc.user_id != ? AND ? IN (f.user_id_1, f.user_id2)
ORDER BY date DESC
LIMIT 30;