Mysql всегда 0 результатов, если данные не найдены в таблицах JOIN, когда данные найдены в другой таблице? - PullRequest
1 голос
/ 11 ноября 2010

У меня проблема с sql ниже. Похоже, запрос возвращает 0 результатов, если ничего не найдено при объединении таблиц group_permissions & users_permissions, даже если что-то найдено у пользователей.

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.

ОБНОВЛЕНО

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

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

Ответы [ 4 ]

3 голосов
/ 11 ноября 2010

Хорошо, я изменился на LEFT JOIN Теперь моя проблема в том, что столбцы user_id и group_id в таблице users перезаписываются столбцами из 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'
2 голосов
/ 11 ноября 2010

Используйте LEFT JOIN.

Здесь очень простое объяснение его использования: http://www.tizag.com/mysqlTutorial/mysqlleftjoin.php

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

2 голосов
/ 11 ноября 2010

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 голосов
/ 11 ноября 2010

Это самая полезная визуализация JOIN'ов, которую я когда-либо видел, поэтому я хочу высказать это здесь, может быть, это кому-нибудь поможет:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...