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