MySQL Query Multiple Joins с неверными результатами

0

У меня есть 3 таблицы, структурированные так:

таблица действий:

activity_id, user_id, type, date

таблица отзывов:

review_id, activity_id, fishery_id, обзор, дата

таблица обновлений:

update_id, activity_id, update, date

Я хочу вызвать все отзывы и обновления, которые связаны с пользователем по таблице действий, но этот запрос возвращает неверные результаты, любые идеи?

query('
  SELECT *
  FROM activity as activity    
  LEFT JOIN reviews AS reviews
    ON activity.activity_id = reviews.activity_id    
  LEFT JOIN updates AS updates
    ON activity.activity_id = updates.activity_id    
  WHERE user_id = 1
');

Спасибо, Мэтт

  • 0
    Что за «неправильные результаты»? Помните ли вы, чтобы разные столбцы из разных таблиц имели разные имена?
Теги:
join

3 ответа

2
Лучший ответ

Вы пытаетесь выбрать два разных набора данных, единственный способ сделать это в одном SQL-заявлении - использовать объединение и создать дополнительные столбцы, чтобы отличить их.

SELECT 'review' as type,r.review_id as id,r.fishery_id as fid,
    r.review as review,null as update,r.date as date
FROM reviews r,activity a
WHERE r.activity_id=a.activity_id AND a.user_id=@user_id

UNION

SELECT 'updates' as type,u.update_id as id,null as fid,
    null as review,u.update update,u.date as date
FROM updates u,activity a
WHERE u.activity_id=a.activity_id AND a.user_id=@user_id
  • 0
    Первоначально я попробовал это, что не дает результатов, я поставил «EXPLAIN» в начале запроса и его высказывание «Невозможно ГДЕ заметил после прочтения const таблиц» и идеи?
  • 0
    Ах да, извините, вы используете activity_id в качестве идентификатора в таблице активности, а не id {Обновлено}
Показать ещё 2 комментария
1

Вероятно, вы не хотите просматривать обзоры и обновления в тех же строках, которые, как представляется, вы пытаетесь сделать. Итак, вам нужны два запроса, а не один:

SELECT r.review_id, r.fishery_id, r.review, r.date
FROM   reviews r
WHERE  EXISTS (SELECT 1 FROM activity a
               WHERE  a.user_id = @user_id
               AND    a.activity_id = r.activity_id)

SELECT u.update_id, u.update, u.date
FROM   update u
WHERE  EXISTS (SELECT 1 FROM activity a
               WHERE  a.user_id = @user_id
               AND    a.activity_id = u.activity_id)
0

Только для справки рабочий запрос:

  SELECT type, review_id, activity.activity_id, review, activity.date, fishery_id
  FROM activity as activity
  JOIN reviews AS reviews
    ON activity.activity_id = reviews.activity_id

  UNION

  SELECT type, activity_id, activity.activity_id, activity, activity.date, NULL
  FROM activity as activity
  JOIN activity AS activity
    ON activity.activity_id = activity.activity_id

  WHERE activity.user_id = 1

  ORDER BY date DESC

Ещё вопросы

Сообщество Overcoder
Наверх
Меню