我有一个sql语句:
$feed=$conn->prepare("SELECT * FROM posts WHERE post_by=? OR id=? ORDER BY id DESC LIMIT 10");
$feed->bind_param("ii",$friend['id'],$like[id]);
$feed->execute();
$friend['id']
是用户朋友的ID,$like[id]
是用户朋友的ID。
使用此查询提取的帖子会显示在页面中。
我想要的是我想知道用户朋友发布了哪些帖子(所有帖子都是使用$friends['id'])
提取的,所有帖子都是由用户的朋友并显示在Feed中(所有帖子都是使用$like['id']
提取的)
我想知道我可以尝试实现我想要的所有可能性。
我尝试用UNION ALL
改变我的查询,但它显示错误,我无法达到我想要的效果。
目前没有错误,但我希望用户知道此帖子在新闻源中的显示方式。
希望你们对我的问题都有一个好主意,所有类型的黑客也被接受,因为我想在某种程度上实现结果,我也同意改变查询性质。
请评论以获取更多信息。
提前致谢。
答案 0 :(得分:1)
SELECT *, post_by = ?postId AS post_by_friend
FROM posts
WHERE post_by = ?postId OR
id = ?friendId
ORDER BY id DESC
LIMIT 10
如果匹配第一个条件, post_by_friend
将为1,否则为0.我没有对其进行基准测试,但此方法应该比StuartLC的UNION
建议更快。
答案 1 :(得分:0)
您可以做的是打破查询“OR”的问题。将子句放入两个单独查询的UNION中,并添加一个标记列以指示该行是由friend
还是like
找到的:
SELECT *
FROM
(
SELECT *, 'Friend' AS HowFound
FROM posts
WHERE post_by= ?postId
UNION
SELECT *, 'Like' AS HowFound
FROM posts
WHERE id= ?friendId AND post_by <> ?postId
) x
ORDER BY id DESC
LIMIT 10;
您希望从其中一个选项中排除与friend
和classifications
匹配的行,否则会报告两次(或者,否则您的应用需要将它们合并)。
我不是PHP大师,但我确定有一种方法可以命名参数以允许上述排除。
需要派生表来订购和限制整体结果。