#php #mysql #left-join #inner-join
#php #mysql #левое соединение #внутреннее соединение
Вопрос:
У меня есть две таблицы
Profile Status
profile_id |name | active status_id |profile_id|age
Мне нужно получить статус, в котором профиль «активный» равен 1, а возраст статуса больше 10
Этот запрос возвращается, когда profile_id совпадают
Select * from
status LEFT JOIN ON status.profile_id = profile.profile_id
но когда я устанавливаю условие where, оно ничего не отображает
Select * from
status LEFT JOIN ON status.profile_id = profile.profile_id
where profile.active= 1 and status.age > 40
Является ли левое соединение правильным типом СОЕДИНЕНИЯ?
Комментарии:
1. вы пропустили второе имя таблицы
2. profile.enabled должен быть profile. активный
3. A
Status
без профиля не имеет смысла. Поскольку вам нужны результаты с определенным возрастом статуса, это должно бытьINNER JOIN
. Если вам также нужны некоторые профили без статуса, тогда вы должны использоватьFROM Profile LEFT JOIN status
…
Ответ №1:
Вы пропустили имя таблицы соединения и profile.enabled
должны profile.active
попробовать это:
Select *
from
status
LEFT JOIN profile ON status.profile_id = profile.profile_id
where
profile.active = 1 and status.age > 40
или
Select *
from
status
LEFT JOIN profile ON status.profile_id = profile.profile_id and status.age > 40
where
profile.active = 1
Комментарии:
1. В этом случае
LEFT JOIN
неявно будет преобразовано в anINNER JOIN
из-за вашегоWHERE
условия. Смотрите ответ @Rahul.
Ответ №2:
Исправьте profile.enabled
на profile.active
, а также вы table name
пропускаете ЛЕВОЕ СОЕДИНЕНИЕ. Попробуйте это
SELECT *
FROM status
INNER JOIN profile ON status.profile_id = profile.profile_id
WHERE profile.active = 1
AND status.age > 40
Комментарии:
1. это работает, но работает даже с внутренним соединением. какой из них рекомендуется?
2. Согласно моему предложению, внутреннее соединение, если вы хотите узнать, чей профиль создан?
3. @meWantToLearn: если вам нужны существующие
age
и толькоactive
профили, тогда вам нуженINNER JOIN
.
Ответ №3:
кажется, что в предложении left join отсутствует имя таблицы. В вашем сообщении вы запрашиваете возраст больше 10, а в порядке sql — 40.
изменить
Select * from
status LEFT JOIN ON status.profile_id = profile.profile_id
where profile.enabled = 1 and status.age > 40
в
Select * from status LEFT JOIN profile ON status.profile_id =
profile.profile_id where profile.active= 1 and status.age > 40
Ответ №4:
если вы пропустили имя таблицы для второй таблицы.
Ваш запрос должен быть таким:
SELECT s.* FROM
status s LEFT JOIN profile p ON s.profile_id = p.profile_id
WHERE p.active= 1 and s.age > 40
Ответ №5:
Попробуйте это.
SELECT *
FROM Profile p,
Status s
WHERE p.profile_id=s.profile_id
AND p.active=1
AND s.age>10
Также, пожалуйста, перепроверьте ваш второй запрос, в нем включено поле, которого нет в профиле.
Комментарии:
1. Вам следует избегать синтаксиса для объединений, он старый, использует разный синтаксис в разных базах данных ( vs * и т. Д.) И его просто трудно читать.
Ответ №6:
Отсутствует таблица ‘profile’ после LEFT JOIN
SELECT * FROM
status LEFT JOIN profile
ON status.profile_id = profile.profile_id
AND profile.active= 1 AND status.age > 40