2015-07-05 3 views
0

У меня есть четыре таблицы, как это:Как присоединиться к таблицам в Mysql с пустым столом

компании (название, описание)

company_users (company_id, user_id)

пользователей (идентификатор, group_id)

user_profiles (user_id, fullname)

Я хочу перечислить кампании.

Мой код заключается в следующем:

SELECT companies.*, user_profiles.fullname as company_contact 
FROM companies 
INNER JOIN company_users ON companies.id = company_users.company_id 
INNER JOIN users ON company_users.user_id = users.id AND users.group_id=500 
INNER JOIN user_profiles ON users.id = user_profiles.user_id; 

Когда я добавить новую кампанию не появляется. Потому что company_id не в company_users.

Как я могу это исправить?

Примечание: Кампания Eeach должна иметь только одного пользователя. group_id этого пользователя 500.

Спасибо

Edit:

Таблицы:

companies 
1 | Test Company | Test Desciption 
2 | Test Company 2 | Test Description 2 



company_users 
1 | 18 | 1 
2 | 19 | 1 

users 
18 | 500  
19 | 900 


user_profiles 
18 | 18 | Test Contact 
19 | 19 | Test User 

LEFT JOIN Результат:

1 Test Company Test Description Test Contact 
1 Test Company Test Description NULL 
2 Test Company 2 Test Description 2 NULL 

INNER JOIN Результат:

1 Test Company Test Description Test Contact 

мне это нужно:

1 Test Company Test Description Test Contact 
1 Test Company 2 Test Description 2 NULL 
+0

пользователь LEFT JOIN вместо INNER JOIN это базовый SQL, это хорошее чтение http://stackoverflow.com/questions/38549/difference-between-inner-and-outer-joins – Jaylen

+0

Нет, это не так просто. Когда я использую LEFT, перечислены все компании со всеми пользователями. Мне нужно только список компаний, которые group_id eq 500. Я обновил свой ответ. Добавлены результаты запроса –

ответ

1

Это звучит, как вы хотите внешнее соединение операции.

Попробуйте заменить все вхождения ключевого слова INNER на ключевое слово LEFT.

Тогда ваш запрос будет возвращать строки из companies, даже если соответствующая строка не найдена в company_users.

EDIT

В ответ на вопрос редактирования, который предоставляет дополнительную информацию.

Если вы хотите возвратить каждую строку в компаниях вместе с полным именем одной строки от связанного пользователя (как показано в желаемом наборе результатов), вы можете использовать подзапрос коррелята в списке SELECT, а не в объединении операция.

Например:

SELECT c.* 
     , (SELECT p.fullname 
      FROM company_users cu 
      JOIN users ON u.id = cu.user_id AND u.group_id=500 
      JOIN user_profiles p ON p.user_id = u.id 
      WHERE cu.company_id = c.id 
      ORDER BY p.fullname ASC 
      LIMIT 1 
     ) AS company_contact 
    FROM companies c 

Примечание ссылка на колонке id в companies в подзапросов; для каждой строки, возвращенной от компаний, значение id из этой строки будет использоваться для выполнения этого подзапроса.Если подзапрос не находит строку для возврата, запрос возвращает значение NULL. Предложение LIMIT 1 гарантирует, что мы вернем не более одной строки. ORDER BY включен только для того, чтобы сделать результат более детерминированным. Если в подзапросе будет возвращено более одной строки, то ORDER BY определит, какое из значений будет возвращено.

+0

Благодарим вас за ответ. Когда я использую LEFT, перечислены все компании со всеми пользователями. Мне нужно только список компаний, которые group_id eq 500. Я обновил свой ответ. Добавлены результаты запроса –

+0

Я добавил примерный запрос, в котором используется коррелированный подзапрос, чтобы вернуть «полное имя» из таблицы user_profiles вместо использования операций объединения. – spencer7593

Смежные вопросы