проблема соединения mysql с условием where

#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 неявно будет преобразовано в an INNER 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