У меня есть небольшая проблема с созданием базы данных системы дружбы. теперь у меня есть таблица под названием «друзья», скажем так:
друзья стола:
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
Тогда вы могли бы легко спросить, кто из друзей смачивания. Просто идея, вероятно, не тот ответ, который вы искали.