2012-04-13 5 views
1

Я новичок в этом виде реляционного типа проектирования баз данных. Я просто создал базу данных таким образом. Тем не менее, я довольно запутался в этом JOIN MySQL. Каким должен быть мой запрос присоединиться ко всей этой таблице. Если вы видите таблицу users, это ссылка на все таблицы.присоединение 4 таблицы

пользователей

+----------+----------------+-----------------+ 
| users_id | users_level_id | users_status_id | 
+----------+----------------+-----------------+ 
|  1 |    1 |    1 | 
|  2 |    2 |    1 | 
+----------+----------------+-----------------+ 

users_credentials

+----------+---------------------------+-----------------------------+----------------------------+ 
| users_id | users_credential_username | users_credential_email  | users_credential_password | 
+----------+---------------------------+-----------------------------+----------------------------+ 
|  1 | super      | [email protected]    | $5$e94e9e$vptscyHjm8rdX0j6 | 
|  2 | admin      | [email protected]    | $5$fVuOmySyC0PttbiMn8in0k7 | 
+----------+---------------------------+-----------------------------+----------------------------+ 

users_level

+----------------+-------------------------+ 
| users_level_id | users_level_description | 
+----------------+-------------------------+ 
|    1 | Super Administrator  | 
|    2 | Administrator   | 
+----------------+-------------------------+ 

users_status

+-----------------+--------------------------+ 
| users_status_id | users_status_description | 
+-----------------+--------------------------+ 
|    0 | Disabled     | 
|    1 | Enabled     | 
+-----------------+--------------------------+ 
+0

Если вы не знакомы с 'JOIN's в SQL, прочитайте несколько статей о них. Две рекомендации: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html и http://en.wikipedia.org/wiki/Join_(SQL) – Bjoern

ответ

2

Попробуйте эту

SELECT u.*, uc.*, ul.*, us.* 
FROM users u 
INNER JOIN users_credentials uc 
    ON u.users_id = uc.users_id 
INNER JOIN users_level ul 
    ON u.users_level_id = ul.users_level_id 
INNER JOIN users_status us 
    ON u.users_status_id = us.users_status_id 

Обратите внимание на использование INNER JOIN: это означает, что если пользователь не имеет corresponing запись на присоединяемой таблицы не будет показано; если вам нужно вернуть каждого пользователя даже без соответствующей записи в связанных таблицах, измените INNER JOIN на LEFT JOIN.

EDITED после пользовательского комментария:
Если вы хотите вернуть только некоторые колонки, определить его как в этом примере

SELECT uc.users_credential_username AS username, 
     uc.users_credential_email AS email, 
     uc.users_credential_password AS pwd, 
     ul.users_level_description AS level, 
     us.users_status_description AS status 
+0

Спасибо Марко. Это лучший способ иметь такой подход, а «AS»? –

+0

@Defensor: pardon, я не понимаю, что вы имеете в виду с «* скорее, с AS *» ... – Marco

+0

Я видел несколько объединений с таким запросом, как этот «a.users_level_id AS level_id», вот что я имею в виду , –

1

Я думаю, это выглядит следующим образом:

SELECT * FROM users 
LEFT JOIN user_credentials ON users.user_id = user_credential.user_id 
LEFT JOIN user_level ON users.users_level_id = users_level.users_level_id 

и так on ..

1

Это простой запрос, который присоединится ко всем из них

select * 
from users 
    left join users_credentials 
    on users_credentials.users_id = users.users_id 
    left join users_level 
    on users_level.users_level_id = users.users_level_id 
    left join users_status 
    on users_status.users_status_id = users.users_status_id 

EDIT

если вы хотите получить данные из разных таблиц пользователя это

select users.* , users_credentials.* , users_level.* , users_status.* 
from users 
    left join users_credentials 
    on users_credentials.users_id = users.users_id 
    left join users_level 
    on users_level.users_level_id = users.users_level_id 
    left join users_status 
    on users_status.users_status_id = users.users_status_id 
1

Используйте этот тип запроса ....

SELECT c.*, l.*, s.* 
FROM users AS u 
INNER JOIN users_credentials AS c ON (u.users_id = C.users_id) 
INNER JOIN users_level AS l ON (u.users_level_id= l.users_level_id) 
INNER JOIN users_status AS s ON (u.users_status_id= s.users_status_id) 

Где можно задать поле, в котором вы хотите. * ...

1

Соединение используется для извлечения данных из нормализованных таблиц, имеющих отношение внешнего ключа к справочной таблице. Для приведенной выше таблицы с объединением вы можете получить данные из двух таблиц с помощью справочной таблицы. Например

Select * from users a JOIN users_credentials b 
ON a.user_id=b.user_id JOIN users_level c 
ON c.users_level_id=a.users_level_id 
where users_credential_username='super'; 

Результат этого запроса даст вам детали, как users_level_description для пользователя с users_credential_username = супер.