这让我很头疼。我将尝试根据用户帖子数据库给出一个很好的示例。
Table1 包含帖子的正文以及作者的唯一 POSTID 和用户名。
Table2 包含由 POSTID(与 Table1 中的 postid 匹配)引用的帖子的“喜欢”数量 (LIKES)。
用户可以在其页面上“分享”其他人的帖子。所以...
Table3 包含共享帖子的 POSTID 以及共享该帖子的用户的用户名。
在用户的页面上,您希望显示他的帖子列表以及他想要共享的帖子。因此,我们需要从 table1(他是用户名)中获取帖子的所有 POSTID,并将其添加到 table3(他是用户名)中的所有 POSTID,然后按 table2 中的 LIKES 数量对所有 POSTID 进行排序。
这是我尝试过的:
SELECT postid
FROM posts_views_likes
LEFT JOIN posts USING (postid)
LEFT JOIN shared_posts USING (postid)
WHERE posts.username = 'abbsmalone'
UNION
SELECT postid
FROM posts_views_likes
LEFT JOIN posts USING (postid)
LEFT JOIN shared_posts USING (postid)
WHERE shared_posts.username = 'abbsmalone'
ORDER BY posts_views_likes.likes DESC
我也尝试过...
SELECT postid
FROM posts
LEFT JOIN posts_views_likes USING (postid)
LEFT JOIN shared_posts USING (postid)
WHERE posts.username = 'abbsmalone'
UNION
SELECT postid
FROM shared_posts
LEFT JOIN posts_views_likes USING (postid)
LEFT JOIN posts USING (postid)
WHERE shared_posts.username = 'abbsmalone'
ORDER BY posts_views_likes.likes DESC
显然,这是行不通的。我不断收到错误消息 #1054 - “订单子(monad)句”中的未知列“喜欢”
我认为这样的事情是可能的吗?
更新:
我也尝试过:
SELECT postid, posts_views_likes.likes
FROM posts
LEFT JOIN posts_views_likes USING (postid)
LEFT JOIN shared_posts USING (postid)
WHERE posts.username = 'abbsmalone'
UNION
SELECT postid, posts_views_likes.likes
FROM posts_views_likes
LEFT JOIN posts USING (postid)
LEFT JOIN shared_posts USING (postid)
WHERE shared_posts.username = 'abbsmalone'
UNION
SELECT postid, posts_views_likes.likes
FROM shared_posts
LEFT JOIN posts_views_likes USING (postid)
LEFT JOIN posts USING (postid)
WHERE posts.username = 'abbsmalone' OR shared_posts.username = 'abbsmalone'
ORDER BY posts_views_likes.likes DESC
但我遇到了同样的错误。
更新已修复:
我终于弄清楚了,它比我试图做的要容易得多。
SELECT postid, posts_views_likes.ratio, posts.username
FROM posts
LEFT JOIN posts_views_likes USING (postid)
LEFT JOIN shared_posts USING (postid)
WHERE posts.username = 'abbsmalone'
OR shared_posts.username = 'abbsmalone'
ORDER BY posts_views_likes.ratio DESC
最佳答案
要让 ONE order
子句对联合结果进行排序,您必须将查询编写为
(SELECT ...)
UNION ALL
(SELECT ...)
ORDER BY ...
根据the docs (搜索对整个内容进行排序或限制
)。
根据文档,您不能使用表名称来引用查询结果中的字段。您必须在各个查询中提供别名:
(SELECT foo AS bar ...)
UNION ALL
(SELECT baz AS bar ...)
ORDER BY bar
关于mysql - 完全连接 3 个表并按一张排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31438495/