0

所以我有一个设计糟糕的数据库(我认为),我无法更改。这是一个类似推特的应用程序,用户可以互相关注。每个用户在表中都有它的行,并且在该表中有一个名为“following”的列,它代表用户正在关注的所有 USERID。在该列中有一个用逗号分隔的 USERID 列表。因此,假设 ID 为 1 的用户正在关注用户 2 和 3,而 ID 为 2 的用户正在关注用户 1,表格将如下所示,用户 3 没有关注任何人。

USERID  |  username         |  following  
-------------------------------------------
1       |  some user        |  2,3                
2       |  test1            |  1                
3       |  test2            |         

问题是如何显示用户 1 关注的所有用户?

编辑 1

从 491243 开始不起作用的代码,在这里发布,也许我错过了 php 中的某些内容

$USERID = $_GET['userid'];//this has a value, so not the problem here
$sql_select = "SELECT B.USERID FROM users A INNER JOIN users B ON FIND_IN_SET(B.USERID, B.following) > 0 WHERE B.USERID = '$USERID'";
$result_select = mysqli_query($link,$sql_select);
while($record = mysqli_fetch_array($result_select))
{
    $following = $record['USERID'];
    var_dump($following); //result is nothing, not even NULL
}

编辑 2 只是为了进行健全性检查,我这样做了:

 $sql_select = "SELECT USERID FROM users WHERE USERID = '1'";
 $result_select = mysqli_query($link,$sql_select);
 while($record = mysqli_fetch_array($result_select))
 {
    $following = $record['USERID'];
    var_dump($following); //result is 1, like it`s supposed to be
 }

回放中的查询是否有可能我的 PHP 代码有误?

4

2 回答 2

5

您的表架构状况不佳。你应该正确地规范它。但是要回答您的问题,您仍然可以获得您想要使用的结果,JOIN并且FIND_IN_SET

SELECT  b.userid, b.username
FROM    tableName a
        INNER JOIN tableName b
            ON FIND_IN_SET(b.userID, a.following) > 0
WHERE   a.userID = 1

我的首选设计是

用户表

  • 用户 ID (PK)
  • 用户名

下表

  • 用户 ID (FK) - 也是一个带有 FollowID 的 PK
  • 关注 ID (FK)
于 2013-09-15T13:08:00.750 回答
1

您可能正在寻找FIND_IN_SET()

SELECT  userid, username
FROM    tableName
WHERE FIND_IN_SET('1', following);

样品小提琴

于 2013-09-15T14:34:55.567 回答