MySQL Join исключая определенные записи? - PullRequest
1 голос
/ 03 августа 2009

Я пытаюсь создать объединение, но я не могу заставить его работать в MySQL, я знаю, что должен быть способ.

У меня есть две таблицы: 1. Setting и 2. User_Setting (и конечно User, но здесь это не понадобится).

Структура

Setting.setting_id
Setting.description
Setting.value_type
Setting.default_value

User_Setting.user_id
User_Setting.setting_id
User_Setting.value

Я хочу выбрать ВСЕ Setting записей и присоединиться к User_Setting там, где есть значение. Классическое внешнее соединение, я бы поверил?

У меня есть этот запрос:

SELECT
`User_Setting`.`user_id`,
`User_Setting`.`value`,
`Setting`.`setting_id`,
`Setting`.`default_value`,
`Setting`.`value_type`,
FROM
`User_Setting`
Right Join `Setting` ON `User_Setting`.`setting_id` = `Setting`.`setting_id`
WHERE
`User_Setting`.`user_id` IS NULL OR
`User_Setting`.`user_id` =  1;

Но это не работает, если User с user_id 2 имеет запись User_Setting для определенного setting_id, но User с user_id 1 не имеет setting_id запись сохранена ...

У кого-нибудь есть запрос, где будут получены ВСЕ настройки, с user_id и value NULL, если запись User_Setting не существует?

Ответы [ 2 ]

2 голосов
/ 03 августа 2009

Это (если вы хотите проверить, существует ли пользователь)

SELECT  `User_Setting`.`user_id`,
        `User_Setting`.`value`,
        `Setting`.`setting_id`,
        `Setting`.`default_value`,
        `Setting`.`value_type`,
FROM    user
CROSS JOIN
        setting
LEFT JOIN
        user_setting
ON      user_setting.user_id = user_id
        AND user_setting.setting_id = setting.setting_id
WHERE   user_id = 1

или это (если вы не хотите проверять, существует ли пользователь):

SELECT  `User_Setting`.`user_id`,
        `User_Setting`.`value`,
        `Setting`.`setting_id`,
        `Setting`.`default_value`,
        `Setting`.`value_type`,
FROM    setting
LEFT JOIN
        user_setting
ON      user_setting.user_id = 1
        AND user_setting.setting_id = setting.setting_id
0 голосов
/ 03 августа 2009

Я обычно добавляю условие к предложению WHERE, чтобы проверить, что первичное значение в объединяемой таблице не равно нулю.

...