【问题标题】:alter query to return a list of followers to include a followedBack field更改查询以返回关注者列表以包含 followBack 字段
【发布时间】:2016-04-25 04:25:34
【问题描述】:

我有一个名为收藏夹的表,其结构如下:

CREATE TABLE IF NOT EXISTS `favourites` (
`ID` int(11) NOT NULL,
  `followerID` int(11) NOT NULL,
  `followedID` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=615 DEFAULT CHARSET=latin1;

我有一个网络服务来检索关注我的用户列表。

SELECT ID, followerID, FName, SName , pic
FROM Favourites 
INNER JOIN users
ON users.UserID = Favourites.followerID 
WHERE followedID = ?
ORDER BY ID Desc
LIMIT  ?, 10

传递到 where 条件的参数在哪里是有问题的用户检索他们的关注者列表。

我需要在此回复中添加一个附加字段,以表明我是否也在关注他们。

我最初尝试添加此内容如下,但出现语法错误。

SELECT ID, followerID, FName, SName, pic, count(SELECT followerid from favourites where followedid = 36) as amFollowing 
FROM Favourites 
INNER JOIN users
ON users.UserID = Favourites.followerID 
WHERE followedID = 36
ORDER BY ID Desc
LIMIT  0, 10

如果有人对如何解决这个问题有任何建议,我很难理解吗?我应该添加一个 isFollowedBack 列并即时更新它,还是有一种简单的方法可以在不更改表结构的情况下实现我想要的?也许我应该使用 CASE 即时计算它?

根据 Linoff 的回答更新:

    SELECT ID, followerID, FName, SName, pic, 
(SELECT COUNT(*) FROM favourites f2 WHERE f2.followedid = f.followerId and f2.followerid = 36 ) as amFollowing 
FROM Favourites f 
INNER JOIN users u ON u.UserID = f.followerID 
WHERE followedID = 36 
ORDER BY ID 
Desc limit 0, 10

(36 是发出请求的人的用户 ID)

运行解释返回:

id             :      1
select_type    :      PRIMARY
table          :      f
type           :      index
possible_keys  :      NULL
key            :      PRIMARY
key_len        :      4
ref            :      NULL
rows           :      10
Extra          :      Using where


id             :      1
select_type    :      PRIMARY
table          :      u
type           :      eq_ref
possible_keys  :      PRIMARY
key            :      PRIMARY
key_len        :      4
ref            :      DBName.f.followerID
rows           :      1
Extra          :      NULL

id             :      2
select_type    :      DEPENDENT SUBQUERY
table          :      f2
type           :      ALL
possible_keys  :      NULL
key            :      NULL
rows           :      716
Extra          :      Using where

【问题讨论】:

标签: mysql sql case inner-join


【解决方案1】:

您可以将count() 移动到子查询中:

SELECT ID, followerID, FName, SName, pic,
       (SELECT COUNT(*)
        FROM favourites f2
        WHERE f2.followedid = f.followedId
       ) as amFollowing 
FROM Favourites f INNER JOIN
     users u
     ON u.UserID = f.followerID 
WHERE followedID = 36
ORDER BY ID Desc
LIMIT 0, 10;

您还应该养成在查询中使用表别名和限定列名的习惯。

【讨论】:

  • 对不起,现在回到这个,您的查询返回,每个请求用户的关注者拥有的关注者数量,而不是调用网络服务的用户是否正在关注他们的关注者.希望这很清楚,很难解释。我根据你的建议得到了查询,所以谢谢你,现在我遇到的问题是,当我运行解释时,我看到 where 查询的类型为“ALL”,这不好!我现在会更新我的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2016-11-15
  • 2022-01-06
  • 2017-04-18
相关资源
最近更新 更多