2010-11-10 1 views
1

У меня возникла проблема с sql ниже. Кажется, что запрос возвращает 0 результатов, если ничего не найдено при подключении таблиц group_permissions & users_permissions, хотя что-то найдено у пользователей.Mysql всегда 0 результатов, если в таблицах JOIN не найдены данные, если данные найдены в другой таблице?

SELECT `*` 
    FROM (`users`) 
    LEFT JOIN `group_permissions` ON `users`.`group_id` = `group_permissions`.`group_id` 
    LEFT JOIN `users_permissions` ON `users`.`user_id` = `users_permissions`.`user_id` 
WHERE `users`.`username` = 'admin' 

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

ОБНОВЛЕНО

Ok я изменил к LEFT JOIN теперь моя проблема заключается в столбцы user_id и group_id пользователей таблицы перезаписаны те из group_permissions & users_permissions в результате чего значение составляет NULL.

Как это исправить? Есть ли способ изменить JOIN, чтобы он не извлекал эти столбцы?

ответ

3

Ok я изменил к LEFT JOIN теперь моя проблема заключается в столбцы user_id и group_id пользователей таблицы перезаписаны те из group_permissions & users_permissions в результате чего значение составляет NULL.

Ваш запрос:

SELECT * 
FROM users 
LEFT JOIN 
     group_permissions 
ON  group_permissions.group_id = users.group_id 
LEFT JOIN 
     users_permissions 
ON  users_permissions.user_id = users.user_id 
WHERE users.username = 'admin' 

возвратит все поля из всех трех таблиц.

Он не будет «перезаписывать» что угодно, скорее он вернет два поля с именем user_id и два поля с именем group_id: те, которые принадлежат users, и те, которые принадлежат к соответствующим таблицам.

Это может смутить клиента, особенно если вы используете ассоциативный массив для доступа к полям (например, mysql_fetch_assoc в PHP).

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

SELECT users.username, users.surname, 
     group_permissions.permission AS group_permission, 
     users_permissions.permission AS users_permission 
FROM users 
LEFT JOIN 
     group_permissions 
ON  group_permissions.group_id = users.group_id 
LEFT JOIN 
     users_permissions 
ON  users_permissions.user_id = users.user_id 
WHERE users.username = 'admin' 
+0

Спасибо за объяснение и пример всегда помогает;) – dark

2

Uhn ... Как насчет использования LEFT JOIN ... ???

SELECT `*` FROM (`users`) 
LEFT JOIN `group_permissions` ON `users`.`group_id` = `group_permissions`.`group_id` 
LEFT JOIN `users_permissions` ON `users`.`user_id` = `users_permissions`.`user_id` 
WHERE `users`.`username` = 'admin' 
+0

Спасибо, я думал, что пробовал, но не думаю: P – dark

+0

Исправить. 'JOIN' эквивалентен' INNER JOIN', @dark, который возвращает только результаты, в которых запись существует с обеих сторон соединения. LEFT (или 'RIGHT') OUTER JOIN (ключевое слово OUTER обычно необязательно) предоставит вам результаты, которые вы ищете. –

+0

Я обновил свои сообщения любые идеи?Спасибо – dark