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`
beforeWHERE
,并在之前添加,uf.`username` AS`friendname`
这似乎有两个问题。首先,它返回用户名“userA”,而不是朋友的用户名。其次,它假设朋友总是user\u id\u 2
——朋友可能在user\u id\u 1
中。这两个问题都有意义?请通读问题底部的工作示例,这正是我想要的-只是不是在单个查询中。您的意思是问题在于您的数据?哪个是不规范的?因此,您的friend\u id
vsuser\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;