2013-09-15 3 views
0

Итак, у меня есть плохо спроектированная база данных (я думаю), которую я не могу изменить. Это приложение для Twitter, в котором пользователи могут следовать друг за другом. У каждого пользователя есть строка `s в таблице, и в этой таблице есть столбец с именем 'follow', который представляет все USERID, которые пользователь выполняет. В этой колонке есть список USERID, отделенный от комы. Так что скажем, что пользователь с идентификатором 1 следит за пользователями 2 и 3, а пользователь с идентификатором 2 следит за пользователем 1, таблица будет выглядеть так, пользователь 3 не следует никому.Выбор всех строк, где столбец имеет определенный ID

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

Вопрос: как я могу показать всех пользователей, которым нужен пользователь 1?

EDIT 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 
} 

EDIT 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-код неверен для запроса в повторах?

+0

Почему это, что люди, ответственные за такой плохой дизайн никогда не должны реально использовать его ... –

ответ

1

Вы могли бы искать FIND_IN_SET()

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

SAMPLE FIDDLE

+0

Это сумасшедший, я вижу, что он работает в скрипке, и он не работает для меня в локальном хосте ... –

+0

Можете ли вы опубликовать исходные данные, которые не попадают на вашу машину? –

+0

Возможно ли, что проблема в версии MySQL. У моей модели 5,5,24, а скрипка - 5.5.32? –

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 

Моя предпочтительная конструкция будет

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

  • Идентификатор_пользователя (ПК)
  • ИмяПользователя

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

  • UserID (FK) - тоже PK с FollowID
  • FollowID (FK)
+0

Ty вы для структуры БД предложение Я хотел спросить (как это сделать лучше). Но пока мне это нужно. Ваш ответ не работает, я делаю var_dump и ничего не получаю от запроса. –

+0

, но он работает на скрипке? возможно, вы его неправильно выполнили. –

Смежные вопросы