【问题标题】:MySQL Ordering from another tableMySQL 从另一个表排序
【发布时间】:2015-03-12 23:35:45
【问题描述】:

我已经为此寻找解决方案一个多小时了,并决定求助于这里。

我正在为我网站的用户创建一个“类似 Twitter”的关注系统,我希望能够显示特定用户关注或关注的每一位用户,我也想这样做按下表中的时间戳排序,降序排列,以使最新的关注者位于顶部。

我遇到的解决方案似乎使用内部联接等,这一切都很好,但我想知道是否有适合我当前查询的逻辑解决方案来执行此操作。

表结构: 用户:

id | username

关注:

id | follower_id | following_id | timestamp

我当前的查询:

SELECT * FROM users WHERE id IN (SELECT follower_id FROM follows WHERE following_id = $user_id) ORDER BY id ASC

当然,这只是按用户 ID 排序,我如何(使用当前查询结构)能够按以下时间戳将订单添加到列表中?

【问题讨论】:

  • 逻辑解决方案是使用连接。你有什么问题?

标签: php mysql select inner-join


【解决方案1】:

MySQL INNER JOIN

"SELECT users.* FROM users 
INNER JOIN follows ON follows.follower_id = users.id 
WHERE follows.following_id = $user_id 
ORDER BY follows.timestamp DESC";

【讨论】:

  • 这并不能完全回答问题;他想按用户 ID ASC 排序,然后按时间戳 DESC 排序;另外,请添加说明而不是链接。
【解决方案2】:

您可以像这样使用多个列进行排序:

ORDER BY [column1] [ASC|DESC], [columm2] [ASC|DESC], ...

因此,编辑查询的 order by 子句以包含第二列并按降序对其进行排序。

必须使用连接来添加列;这是连接的基本语法:

SELECT [table_name].[column_name], ...
FROM [table1]
JOIN [table2] ON [join condition]
...

您的代码应如下所示:

SELECT users.*
FROM users
JOIN follows ON users.id = follows.following_id
WHERE follows.following_id = $user_id
ORDER BY users.id ASC, follows.timestamp DESC

据我所知,如果不加入表格,没有方法可以做到这一点;也许可以对返回的列表进行排序,但不能保证):

SELECT * FROM users
WHERE id IN (SELECT follower_id FROM follows
  WHERE following_id = $user_id
  ORDER BY timestamp DESC)
ORDER BY id ASC;

以上方法可能有效,也可能无效(我没有测试过);如果是,您必须使用加入查询

【讨论】:

  • 您不能按不在结果集中的列排序
  • 哦,他应该使用连接;抱歉,我略读了
猜你喜欢
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
  • 2011-03-05
相关资源
最近更新 更多