Вывести все переменные с нулевым значением

#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, и теперь он показывает так, как я хочу. Спасибо