MySQL LEFT JOIN не возвращает NULL для пропущенных строк - PullRequest
0 голосов
/ 27 декабря 2018

Я, наверное, все испортил.Но у меня есть система WordPress, где я пытаюсь создать экспорт конкретных пользовательских данных в MySQL.Я ожидаю, что метаданные вернут NULL, если строка не существует, но вместо этого кажется, что она действует как предел.Если какие-либо из метаданных не существуют, весь пользователь опускается.

SELECT
  users.ID,
  users.user_email,
  _first.meta_value as firstName,
  _second.meta_value as lastName,
  users.display_name,
  _gender.meta_value as gender,
  _age.meta_value as age,
  _nationality.meta_value as nationality

FROM kp_users

LEFT JOIN usermeta as _first ON kp_users.id = _first.user_id
LEFT JOIN usermeta as _second ON kp_users.id = _second.user_id
LEFT JOIN usermeta as _gender ON kp_users.id = _gender.user_id
LEFT JOIN usermeta as _age ON kp_users.id = _age.user_id
LEFT JOIN usermeta as _nationality ON kp_users.id = _nationality.user_id

WHERE
  _first.meta_key = 'first_name' AND
  _second.meta_key = 'last_name' AND
  _gender.meta_key = '_user_demographics_gender' AND
  _age.meta_key = '_user_demographics_age' AND
  _nationality.meta_key = '_user_demographics_nationality'

Итак, для строк метаданных, где, скажем, строка _user_demographics_age не существует, весь пользователь исключается из окончательного набора результатов, и я не могу понять, почему,

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018

Переместите ваши левые таблицы соединения "где" условия в относительные "on" условия.В данный момент вы получаете пустые поля, а затем условие where фильтрует их, потому что _first.meta_key имеет значение null, и это не равно 'firsst_name,

0 голосов
/ 27 декабря 2018

Переместите все ваши фильтры с where на left join:

LEFT JOIN usermeta as _first ON kp_users.id = _first.user_id and _first.meta_key = 'first_name' LEFT JOIN usermeta as _second ON kp_users.id = _second.user_id and _second.meta_key = 'last_name' -- etc.

Оптимизатор MySQL изменит left join на join, если в левой соединенной таблице есть условия вwhere часть запроса (это приближение, есть дополнительные правила).

0 голосов
/ 27 декабря 2018

Вы должны поместить свои условия в положение ON вместо условия Where, как показано ниже -

SELECT
  users.ID,
  users.user_email,
  _first.meta_value as firstName,
  _second.meta_value as lastName,
  users.display_name,
  _gender.meta_value as gender,
  _age.meta_value as age,
  _nationality.meta_value as nationality

FROM kp_users

LEFT JOIN usermeta as _first ON kp_users.id = _first.user_id and _first.meta_key = 'first_name'
LEFT JOIN usermeta as _second ON kp_users.id = _second.user_id and _second.meta_key = 'last_name'
LEFT JOIN usermeta as _gender ON kp_users.id = _gender.user_id and _gender.meta_key = '_user_demographics_gender'
LEFT JOIN usermeta as _age ON kp_users.id = _age.user_id and _age.meta_key = '_user_demographics_age'
LEFT JOIN usermeta as _nationality ON kp_users.id = _nationality.user_id and _nationality.meta_key = '_user_demographics_nationality'
...