2011-06-28 6 views
0

Моя пользовательская таблица не является необычной и использует основное поле id в качестве идентификатора пользователя.Связать друг друга и таблицу пользователей (чтобы получить имена пользователей?)

Мои друзья таблица выглядит это, однако:

CREATE TABLE `friends` (
    `uid` INT NOT NULL ,      
    `fid` INT NOT NULL ,     
    PRIMARY KEY (`user_id`, `friend_id`) 
) ENGINE = MYISAM ; 

я могу легко найти друзей одного пользователя, то есть

SELECT fid FROM friends WHERE uid = 12 

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

Прямо сейчас я делаю это уродливое метод:

SELECT username FROM users WHERE id IN (1,2,3,4..(other fid's)..) 

Это не кажется правильным вообще.

Как мне это сделать?

+0

Внешние ключи также полезны, но не нужны в вашем случае. они обеспечивают относительную согласованность базы данных. – heximal

ответ

1

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

SELECT * FROM friends 
INNER JOIN users 
ON users.id = friends.fid 
WHERE friends.uid = 1; 

Что это делать, конечно, выбирает друзей записи, которые соответствует критериям WHERE, и из этих записей находит соответствующую строку в таблице пользователей в соответствии с отношением, определенным в предложении ON. (Технически в дб двигатель работает немного по-другому, хотя) В результате набор ряд будет включать в себя все столбцы из обоих друзей и пользователей таблицы, но вы можете изменить столбцы в результате путем определения в SELECT, как:

SELECT friends.uid as uid, friends.fid as fid , users.username as username 

Вам не нужно явно указывать внешний ключ в таблице друзей, чтобы сделать такое простое соединение. Но это поможет вам отслеживать отношения между таблицами, и, кроме того, вы можете заставить MySQL автоматически поддерживать свою базу данных при удалении или обновлении строк. http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html.

+0

Спасибо за этот пример, он выглядит очень красиво по сравнению с тем, что я делал, и у меня есть предлог, чтобы наконец изучить синтаксис JOIN! Благодарим вас за упоминание части «как», при спаде меня спасут несколько волос. –

0

вы должны использовать JOIN. Вы должны присоединиться к друзьям таблицу с пользователями таблицы:

select 
    f.fid, 
    u.name as friend_name 
from 
    friends f 
join 
    users u on u.id = f.fid and f.uid = 16 
+0

И это в основном возвращает все идентификаторы-друзья и сопоставляет их с таблицей пользователей и печатает любые столбцы, которые вам нравятся. Вы можете сделать «select * ...», чтобы увидеть все возвращенные столбцы. –

+0

да, вы правильно. Я отредактировал свой ответ – heximal

0
SELECT 
     u.username, 
     f.fid 
FROM 
     friends f, 
     users u 
WHERE 
     f.uid = 12 and 
     u.uid = f.fid 
0

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

PRIMARY KEY (`user_id`, `friend_id`) 

Эти столбцы не существуют в вашем столе.

Второе:

SELECT users.username FROM friends,users WHERE users.id=friends.fid 
Смежные вопросы