Простой дизайн базы данных списка друзей

У меня есть небольшая проблема с созданием базы данных системы дружбы. теперь у меня есть таблица под названием «друзья», скажем так:

друзья стола:

you friend approve since _________________________________________________ wetube youtube 1 4-12-2012 facebook wetube 1 4-12-2012 

и у меня есть этот код запроса, чтобы вытащить друзей пользователя под названием wetube.

 mysql_query("SELECT f.* FROM friends f inner join users u on u.username = f.you WHERE f.friend = 'wetube' UNION ALL SELECT f.* FROM friends f inner join users u on u.username = f.friend WHERE f.you = 'wetube'"); 

теперь то, что я хочу, это именно то, как забрать фриренс смачивания и показать его ему на своей странице.

исправлено:

Наконец, я исправил проблему. так что это таблица:

 CREATE TABLE IF NOT EXISTS `friends` ( `id` int(20) NOT NULL AUTO_INCREMENT, `you` varchar(255) NOT NULL, `friend` varchar(255) NOT NULL, `type` varchar(255) NOT NULL, `since` date NOT NULL, `message` text NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `id` (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; 

и это php-код для извлечения друзей пользователя

 <?php $username = $_SESSION['username']; $friends_sql = mysql_query("SELECT * FROM friends WHERE (friend = '$username' OR you = '$username') "); while($friends_row = mysql_fetch_assoc($friends_sql)){ if ($username == $friends_row['you']) { echo $friends_row['friend']."<br/>"; } elseif($username == $friends_row['friend']) { echo $friends_row['you']."<br/>"; } } ?> 

попробуйте сами, это работает 100%

 $result = mysql_query("SELECT * FROM friends WHERE friend='wetube'"); $row = mysql_fetch_array($result); echo $row['friend'], ' - ', $row['since']; 

Не прямой ответ на ваш вопрос, но полностью нормализованная база данных будет иметь две таблицы для этой системы.

Поскольку это отношения «многие-ко-многим», я бы сделал что-то вроде этого:

 UsersTable ------------------ id: int, serial name: varchar email: varchar ... 

А также

 RelationshipTable ------------------ id: int, serial user1_id: int, foreign key on UsersTable.id user2_id: int, foreign key on UsersTable.id approved: boolean since: date 

С правильно спроектированной и нормализованной базой данных будет намного проще управлять и создавать ваши запросы.

Вы имеете в виду только строки с смачиванием в колонке [друг]? Вы можете просто подумать о присоединениях:

 SELECT * FROM [friends] WHERE [friend] = 'wetube' 

Если вы хотите, чтобы смазка была в любой колонке:

 SELECT * FROM [friends] WHERE [friend] = 'wetube' OR [you] = 'wetube' 

Или:

 SELECT * FROM [friends] WHERE [friend] = 'wetube' UNION ALL SELECT * FROM [friends] WHERE [you] = 'wetube' 

Все друзья смачивателя:

 SELECT * FROM friends WHERE (friend = 'wetube' OR you = 'wetube') AND approve = 1 

Я бы предложил удалить колонку, одобрив и вместо этого сохранив таблицу запросов. Это будет означать, что все одобренные запросы находятся в таблице друзей, и все ожидающие утверждения находятся в таблице friend_request (или что-то еще).

Этот дизайн двух таблиц более эффективен, потому что вам не всегда нужно проверять, утверждают ли вы = 1, когда вы хотите показать друзей (что, вероятно, довольно часто).

Возможно, это не совсем понятно.

Выберите * из друзей f, где f.you = 'wetube' или f.friend = 'wetube'

Угадайте, что вы ищите информацию о пользователе, причина для внутренних подключений.

Возможно удаление столбца утверждения и наличие 2 записей. Вторая запись – это когда друг одобряет друга. Тогда вы можете легко увидеть, с кем вы дружите, и они в свою очередь дружат.

 wetube --> youtube facebook --> youtube youtube --> wetube wetube would approve a friendship request for youtube, adding a record wetube --> facebook 

Тогда вы могли бы легко спросить, кто из друзей смачивания. Просто идея, вероятно, не тот ответ, который вы искали.