#mysql #sql
#mysql #sql
Вопрос:
Я пытаюсь распечатать имена пользователей, взятые из одной таблицы, и процессы из другой таблицы и объединить их с одной таблицей. Однако не все имена имеют процессы, поэтому мне нужно распечатать NULL
или просто пустое место в столбце процессы.
Вот sql, который я использую:
SELECT projectNo,
proc_leader,
group_concat(process) AS processes
FROM proc_leader
INNER JOIN user ON user.username = proc_leader.proc_leader
GROUP BY proc_leader,
projectNo;
Редактировать
Хорошо, я хочу отобразить все имена пользователей и назначенные процессы для каждого имени пользователя. Например, что-то вроде этого:
username| processes | projectNo |
-------- ------------------ -----------
barikan | ANM BLD, BGD CUP | 16001 |
beny | BGD | 16003 |
aaron | NULL | NULL |
alon | NULL | NULL |
candy | BLD FCP | 16003 |
Что я получил после использования sql:
SELECT projectNo,
proc_leader,
group_concat(process) AS processes
FROM user
LEFT JOIN proc_leader ON user.username = proc_leader.proc_leader
GROUP BY proc_leader, projectNo;
Он дает мне только имена с процессами, но как получить все nma? Спасибо
Комментарии:
1.
OUTER JOIN
это то, чего ты хочешь.
Ответ №1:
ПОСЛЕ ВАШЕГО РЕДАКТИРОВАНИЯ
Вы должны напечатать user.username, а не столбец proc_leader! Поскольку вы получаете всех пользователей, даже если proc_leader не связан, поэтому, если вы распечатаете proc_leader, вы не увидите всех пользователей.
SELECT projectNo, username, group_concat(process) AS processes
FROM user
LEFT JOIN proc_leader ON user.username = proc_leader.proc_leader
GROUP BY username, projectNo;
ПЕРЕД РЕДАКТИРОВАНИЕМ
Я не совсем понимаю вашу потребность, но помните, что когда вы выполняете ВНУТРЕННЕЕ СОЕДИНЕНИЕ с user.username, вы получаете только имя пользователя, которое соответствует proc_leader.
Поэтому, если вы хотите отобразить НУЛЕВОЕ имя пользователя или пустое имя из [Таблицы 1], вам нужно вместо этого выполнить ЛЕВОЕ СОЕДИНЕНИЕ. (он же ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ)
Дополнительная информация: он взял все строки из A, даже без появления на B.
Комментарии:
1. это пример того, как я хочу, чтобы это выглядело, а ниже приведено то, что я на самом деле получил при использовании LEFT JOIN
2. Да, извини, я видел это после. Я отредактировал свою команду, вам нужно выбрать username, а не proc_leader в начале
3. О, я понимаю, спасибо, не могу проголосовать, потому что недостаточно репутации, спасибо за ответ
4. Нет проблем! Вы можете пометить мой пост как ответ, если это сработает, чтобы закрыть тему: P
Ответ №2:
Вы могли бы использовать ЛЕВОЕ СОЕДИНЕНИЕ вместо ВНУТРЕННЕГО СОЕДИНЕНИЯ. Таким образом, вы возвращаете всех пользователей, и для каждого пользователя без связанного процесса он выдаст вам значения null в столбце process .
SELECT projectNo,
proc_leader,
group_concat(process) AS processes
FROM user
LEFT JOIN proc_leader ON user.username = proc_leader.proc_leader
GROUP BY proc_leader, projectNo;
Кроме того, таблица «FROM» должна быть таблицей users, то есть таблицей, в которую вы хотите, чтобы были возвращены все значения.
Комментарии:
1. это дает мне просто NULL в первой строке, а затем только имена с процессами, см. Редактирование, пожалуйста
2. Разве не удивительно, что повторяющиеся ответы находятся в большем взаимодействии, чем исходные, пожалуйста, постарайтесь дать четкие ответы, если это возможно, хотя вы получаете хороший результат от dup 😉
Ответ №3:
Вы можете просто использовать LEFT JOIN для этого случая
SELECT projectNo,
proc_leader,
group_concat(process) AS processes
FROM user
LEFT JOIN proc_leader ON user.username = proc_leader.proc_leader
GROUP BY proc_leader, projectNo;
Я надеюсь, что столбец process существует в proc_leader, если это не так, то поменяйте имена таблиц местами.
Комментарии:
1. Все еще получаю только имена с процессами, могу просмотреть мое редактирование, спасибо
2. @Yevgeniy пустая строка там не имеет никакого смысла, потому что на основе which мы извлекаем запись из этой дочерней таблицы, даже если proc_leader также пуст.
3. Я изменил proc_leader на username, и теперь он показывает так, как я хочу. Спасибо