mysql - 完全连接 3 个表并按一张排序

标签 mysql

这让我很头疼。我将尝试根据用户帖子数据库给出一个很好的示例。

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/

相关文章:

javascript - 对 PHP 函数的 AJAX 调用不会使其向我的数据库输入值

php - MySQL:连接两个具有匹配行名的表

php - 在选择表单中使用 AJAX

mysql - mysql 索引是否将 UTF-8 转换为 ASCII?

php - android 用户名密码通过json发送到php-->sql

mysql - #1142 - 拒绝用户 ___ 对表 ___ 的 INSERT 命令

mysql - 使用 Laravel 比较不同表中的两个字段

mysql - 如何针对第一个查询的结果运行第二个查询?

php - 如何使用 PHP 的 PDO 强制创建新的数据库连接来连接 MySQL

mysql - 如何查询 "Entity Attribute Value"表和另一个表之间的多个关系?