Сделать SQL запрос из четырех таблиц - PullRequest
0 голосов
/ 29 января 2012

В моей базе данных есть 4 таблицы:

пользователи

  • id
  • имя пользователя

images

  • id
  • user_id
  • image

user_follow

  • user_id
  • user_follow

комментарии

  • image_id
  • текст

Я пытаюсь сделать запрос, чтобы получить все мои фотографии и фотографии моих друзей 1) строка должна отображаться только в том случае, если у пользователя есть изображение в таблице «images» 2) только изображение от меня и моих друзей (в зависимости от «user_follow»)таблица) 3) количество комментариев для каждого изображения

мой запрос:

SELECT u.username as user, i.image as user_image, p.image, UNIX_TIMESTAMP(p.date) as date, COALESCE ( imgcount.cnt, 0 ) as comments
FROM users u              
LEFT JOIN user_follow f ON u.id = f.follow_id
LEFT JOIN images p ON p.user_id = u.id
LEFT JOIN images i ON i.id = (SELECT b.id FROM images AS b where p.user_id = b.user_id ORDER BY b.id DESC LIMIT 1)
LEFT JOIN (SELECT image_id, COUNT(*) as cnt FROM commentaries GROUP BY image_id  ) imgcount ON p.id = imgcount.image_id
WHERE f.user_id = 3 OR p.user_id = 3       
ORDER BY p.date DESC

Количество комментариев для каждой строки sql изображения работает нормально в этом запросе

LEFT JOIN (SELECT image_id, COUNT(*) as cnt FROM commentaries GROUP BY image_id  ) imgcount ON p.id = imgcount.image_id

в этой строке я пытаюсь получить от пользователя последнее загруженное изображение в виде аватара из таблицы "images"

   LEFT JOIN images i ON i.id = (SELECT b.id FROM images AS b where p.user_id = b.user_id ORDER BY b.id DESC LIMIT 1)

Этот запрос не дает правильного результата, поскольку показывает моих друзей, у которых нет фотографийи что-тоне хорошо с моими собственными фотографиями (в базе данных у меня есть 2 строки с моим user_id: 3), но sql возвращает 4

1 Ответ

2 голосов
/ 29 января 2012

Если я правильно понимаю, кажется, что вы сделали это намного сложнее, чем нужно. Причина, по которой вы получаете записи для своих друзей без картинок, заключается в том, что вы используете LEFT JOIN. Измените это на INNER JOIN, и вы получите только те записи, которые соответствуют условию соединения.

Я думаю, вы ищете что-то вроде следующего. Вам нужно будет сделать несколько настроек, но, надеюсь, это поможет.

SELECT u.username as user, i.image as user_image, count(*) as comments
FROM users u              
INNER JOIN user_follow f ON u.id = f.follow_id
INNER JOIN images p ON p.user_id = u.id
INNER JOIN commentaries c ON c.image_id = p.id
WHERE u.user_id = 3
GROUP BY u.username, i.image;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...