我为社交媒体应用程序开发的mysql查询存在一些问题,用户可以在其中发布其feed / post并查看“喜欢”,“评论”和“共享”计数的数量-类似于Facebook和Twitter。
我遇到麻烦的部分是查询提要,并获取每个提要中的“点赞”次数。
基本上我有两个表:
user_feeds
是保存“提要”数据的表。
user_feed_likes
保存分配给与feed_id
表的id
相关的user_feeds
的提要的“赞”
我如何查询提要并执行内部子查询来查询点赞表中的点赞次数(count /)/并返回两个查询的结果?
表格如下:
user_feeds
| id | feed | phone | time_stamp |
-----------------------------------------------
| 0 | good day | 25470159224 | 08/08/2018 |
| 1 | bad day | 254701594224 | 08/09/2018 |
| 2 | normal day | 254701594224 | 08/10/2018 |
user_feed_likes
| id | feed_id | time_stamp |
-----------------------------
| 0 | 1 | 08/08/2018 |
| 1 | 1 | 08/08/2018 |
| 2 | 0 | 09/10/2018 |
我想从user_feeds
中选择,并从user_feed_likes
获得喜欢的次数,其中user_feed
id
= [value which is also contained in likes as feed_id]
这是我的php编码尝试,未能按预期进行。
function get_post_id($con,$contact_owned,$shared_post_id,$from,$to){
$sql="SELECT user_feeds.*,user_credentials.username,profile_pic.imagenamesized,user_feed_likes.user_feed_id AS no_likes
FROM user_feeds
INNER JOIN user_credentials ON user_feeds.phone=user_credentials.phone
INNER JOIN profile_pic ON user_feeds.phone=profile_pic.phone
LEFT JOIN user_feed_likes ON user_feed_likes.user_feed_id
=(SELECT count(user_feed_id) FROM user_feed_likes WHERE user_feed_id='user_feeds.id')
WHERE user_feeds.phone IN('".implode("','",$contact_owned)."') ORDER BY time_stamp desc LIMIT $from,$to;";
$result=mysqli_query($con,$sql);
if (mysqli_num_rows($result)>0) {
while ($rows=$result->fetch_assoc()) {
$row_arry['id']=$rows['id'];
$row_arry['phone']=$rows['phone'];
$row_arry['feed']=$rows['feed'];
$row_arry['image_1']=$rows['image_1'];
$row_arry['image_2']=$rows['image_2'];
$row_arry['Image_3']=$rows['Image_3'];
$row_arry['image_4']=$rows['image_4'];
$row_arry['time_stamp']=$rows['time_stamp'];
$row_arry['username']=$rows['username'];
$row_arry['imagenamesized']=$rows['imagenamesized'];
$row_arry['no_likes']=$rows['no_likes'];
//array_push($respond, $row_arry);
# code...
}
# code...
}
任何有关选择提要并获得提要喜欢的次数的帮助都会有很大帮助。
答案 0 :(得分:0)
我真的非常不喜欢发布我尚未测试过的答案,但是为了解决这个问题,我会采取行动。
"SELECT
a.id, a.feed, a.phone, a.time_stamp,
b.username,
c.imagenamesized,
COUNT(d.id) AS likes
FROM user_feeds a
INNER JOIN user_credentials b ON a.phone = b.phone
INNER JOIN profile_pic c ON a.phone = c.phone
LEFT JOIN user_feed_likes d ON a.id = d.feed_id
WHERE a.phone IN ('" . implode("',', $contact_owned) . "')
GROUP BY a.id
ORDER BY a.time_stamp DESC
LIMIT $offset, $limit"
由于user_feed_likes
可能包含特定feed_id
的零“赞”,因此LEFT JOIN
是正确的JOIN
。您的LEFT JOIN
语法应反映您的INNER JOIN
。
通过使用GROUP BY
,您可以生成COUNT()
可以愉快使用的汇总数据。
为使查询更短并可能更易于阅读,我建议使用表别名(a
,b
,c
,d
)。在声明别名时,您可以在别名之前写上AS
关键字作为语法糖,但是我认为更常见的是省略它。
您的$from
和$to
对于变量名不是很好的选择,因为从字面上看,这并不是它们所保存的数据。 $from
并不可怕,但是$to
可能会误导您将来的代码读者。这就是为什么我在摘要中对其进行了更改。
作为最佳实践,您应该始终以大写形式编写mysql关键字,以提高可读性。
根据最佳实践,您应该避免在*
子句中使用SELECT
。仅从您打算使用的列中提取数据。这样一来,您就可以循环结果集,只需将整个$row
推入$respond
中,而不必用[key]
明确命名每列。
您应该再次梳理脚本,并确保始终使用面向对象的mysqli语法。混合过程和面向对象不是最佳实践。我更喜欢面向对象,因为它更简洁。
如果您不知道,可以直接使用$result
迭代foreach()
,而无需调用fetch_assoc()
。
避免声明一次性变量。如果您只是将数据推送到另一个数组中,则无需中间变量。
我不知道您的$contact_owned
数组(也考虑重命名此变量以更好地描述它包含的数据。例如$user_phone_numbers
)是否来自用户提交,但是是否来自表单提交或其他不受信任的来源,则您必须实施准备好的声明,以确保安全性和稳定性。请参阅这篇有关如何使用可变数量的占位符构建准备好的语句的帖子:https://stackoverflow.com/a/52323556/2943403
如果$contact_owned
来自数据库的先前查询,则减少直接访问数据库的总次数更为直接,只需编写WHERE
逻辑以使用用户ID或其他内容,而不是您当前的IN
逻辑。这甚至可以使您避免繁琐的预处理语句语法。