Выбор всех строк, где столбец имеет определенный идентификатор

Так что у меня есть плохо спроектированная база данных (я думаю), которую я не могу изменить. Это приложение, похожее на твиттер, где пользователи могут следить друг за другом. У каждого пользователя есть строка в таблице, и в этой таблице есть столбец с именем "follow", который представляет все USERID, за которыми следует пользователь. В этом столбце есть список USERID, разделенных комой. Итак, предположим, что пользователь с идентификатором 1 следует за пользователями 2 и 3, а пользователь с идентификатором 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-код неверен для запроса в повторах?

2 ответа

Решение

Возможно, вы ищете FIND_IN_SET()

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

Образец скрипки

Ваша схема таблицы в плохом состоянии. Вы должны нормализовать это должным образом. Но чтобы ответить на ваш вопрос, вы все равно можете получить желаемый результат, используя 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

Мой предпочтительный дизайн будет

Таблица пользователей

  • ИД пользователя (ПК)
  • UserName

Следующая таблица

  • UserID (FK) - также ПК с FollowID
  • FollowID (FK)
Другие вопросы по тегам