Условие в запросе MySQL - PullRequest
1 голос
/ 01 марта 2012

Прошу прощения, если я ошибаюсь, у меня есть 3 таблицы в моей базе данных по имени user, view_history, online_status

user

 user_id    first_name    last_name
    2         jhon         watson
    4         boob         hasel
    5         hena         Montena

view_history

user_id    pv_user_id
 4            2
 5            2

online_status

user_id
  4

КРАТКОЕ ОПИСАНИЕ:

1)user table is user basic information of user,
2)view_histroy table is profile viewer,that is by above `view_history` table user `4` had looked into user `2` profile etc.
3)online_status table with one column user_id consist records of user id's who are online, if they are offline then record will be deleted.

Итак, теперь я хочу запросить список тех, кто просматривал профиль 2 с их онлайн-статусомя написал запрос ниже:

SELECT
      view_history.user_id, 
      view_history.pv_date, 
      user.first_name, 
      user.last_name, 
      online_status.user_id
   FROM
      view_history, 
      user, 
      online_status
   WHERE
        view_history.user_id = user.user_id
    AND online_status.user_id = user.user_id
    AND view_history.pv_user_id = 2

, но я не получаю информацию о пользователе 5, который не в сети.Помоги мне!Заранее спасибо

Ответы [ 5 ]

1 голос
/ 01 марта 2012

Вам нужно использовать современный синтаксис JOIN, который позволяет вам делать LEFT JOIN, что вам нужно:

SELECT
    view_history.user_id,
    view_history.pv_date,
    user.first_name,
    user.last_name,
    online_status.user_id
FROM user
LEFT JOIN view_history ON view_history.user_id = user.user_id
LEFT JOIN online_status ON online_status.user_id = user.user_id
WHERE user.user_id = 2

A LEFT JOIN означает, что вы по-прежнему получаете строку, даже если нет подходящих строк (столбцы из левой объединенной таблицы будут иметь значения null, если нет соответствующей строки)

Я переставил таблицы в более разумный порядок и изменил предложение where для поиска записи пользователя.

Я рекомендую также использовать LEFT JOIN на view_history, если нет истории (пока).

Кроме того, этот синтаксис упрощает просмотр предиката join по сравнению с предикатом filter

0 голосов
/ 10 июля 2012

В этом случае вы должны использовать LEFT JOIN, чтобы получить всю информацию о пользователе с онлайн-статусом и историей.

SELECT
vh.user_id,
vh.pv_date,
u.first_name,
u.last_name,
os.user_id
FROM user u
LEFT JOIN view_history vh ON vh.user_id = u.user_id
LEFT JOIN online_status os ON os.user_id = u.user_id
WHERE u.user_id = 2

, если вы используете Inner join, тогда только информация пользователя поступает, чья онлайн.

0 голосов
/ 01 марта 2012
  1. Поскольку мы ищем пользователей, которые заглянули в профиль пользователя, нам нужно добавить фильтр в столбец pv_user_id. Также для левых объединений я обнаружил, что лучше поместить фильтры в состояние ON левого объединения, чтобы они применялись до того, как будут получены результаты

  2. Внутреннее присоединение к online_status ограничено пользователями, которые находятся в сети

  3. Я переделал @ богемный запрос ниже

    SELECT
     view_history.user_id,
     view_history.pv_date,
     user.first_name,
     user.last_name,
     online_status.user_id
    FROM user
    INNER JOIN online_status ON online_status.user_id = user.user_id
    LEFT JOIN view_history ON view_history.user_id = user.user_id AND pv_user_id = 2
    
0 голосов
/ 01 марта 2012

Ваше предложение AND online_status.user_id = user.user_id исключает информацию офлайн-пользователя.Попробуйте использовать LEFT JOIN.

0 голосов
/ 01 марта 2012

Да, потому что у вас есть условие

online_status.user_id = user.user_id

А в таблице online_status есть только user_id 4.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...