У меня есть 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
');
Спасибо, Мэтт
Вы пытаетесь выбрать два разных набора данных, единственный способ сделать это в одном 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
activity_id
в качестве идентификатора в таблице активности, а не id
{Обновлено}
Вероятно, вы не хотите просматривать обзоры и обновления в тех же строках, которые, как представляется, вы пытаетесь сделать. Итак, вам нужны два запроса, а не один:
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)
Только для справки рабочий запрос:
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