У меня в настоящее время это
SELECT * FROM images WHERE images.id IN (SELECT image_id FROM image_likes WHERE user_id = '1') UNION SELECT * FROM images WHERE images.user_id = '1' AND upload_type in (4,3) ORDER BY id DESC
И это отлично работает, но теперь я хочу, чтобы он отображал самые последние результаты, которые произошли. Например, Пользователь A загружает информацию image-> в images
с меткой времени. Пользователь A тогда любит чужое изображение -> Информация переходит в image_likes
с меткой времени. Теперь, как бы я объединил два столбца timestamp, чтобы сортировать их по DESC.
Брейф пробегает то, что делает запрос. Выбирает информацию об изображении с images
где пользователю понравилось изображение в image_likes
а затем он захватывает все загрузки, которые пользователь загрузил из images
и объединяет их в запрос. Мне нужно, чтобы они сортировали их, используя timestamp
из обеих таблиц.
как насчет этого?
SELECT * FROM ( SELECT * FROM images WHERE images.id IN (SELECT image_id FROM image_likes WHERE user_id = '1') UNION SELECT * FROM images WHERE images.user_id = '1' AND upload_type in (4,3) ORDER BY id DESC ) AS a ORDER BY a.timestamp DESC;
ИЛИ еще лучше
(SELECT * FROM images WHERE images.id IN (SELECT image_id FROM image_likes WHERE user_id = '1')) UNION (SELECT * FROM images WHERE images.user_id = '1' AND upload_type in (4,3) ORDER BY id DESC) ORDER BY timestamp DESC
chk this http://dev.mysql.com/doc/refman/5.5/en/union.html
ОБНОВИТЬ
ПОПРОБУЙ ЭТО
(SELECT images.id, images_likes.timestamp as timestamp FROM images JOIN images_likes ON images.id=image_likes.image_id WHERE user_id = '1') UNION (SELECT images.id, images.timestamp as timestamp FROM images WHERE images.user_id = '1' AND upload_type in (4,3) ORDER BY id DESC) ORDER BY timestamp DESC
ОБНОВИТЬ
Окончательный запрос согласно вашему требованию
(SELECT images.id, images.user_id, images.ext, images.upload_type, images_likes.timestamp as timestamp FROM images JOIN images_likes ON images.id=image_likes.image_id WHERE images_likes.user_id = '1') UNION (SELECT images.id, images.user_id, images.ext, images.upload_type, images.timestamp as timestamp FROM images WHERE images.user_id = '1' AND upload_type in (4,3) ORDER BY id DESC) ORDER BY timestamp DESC
Я бы подошел со следующим … «PreQuery» ниже начинается со всех изображений, которым нравится пользователь в первую очередь, с максимальной меткой времени в качестве нового столбца «MostRecent». Затем, выполните UNION ALL для следующего набора. Следующий набор находится непосредственно из таблицы изображений для пользователя, но LEFT JOINED для изображений «Понравилось». Тогда предложение WHERE явно исключает те, которые были бы возвращены в первом наборе, используя «iml2.image_id IS NULL». Я сделал это, поскольку я не был уверен в том, как профсоюз будет обрабатывать группу в первом наборе, но не во второй группе. Пример: если изображение было создано с датой / меткой времени, например, 3 марта, но также найдено как «Как» 5 марта, я не хотел, чтобы один экземпляр указывался как каждая отдельная дата (поскольку союз уже квалифицирует явно подразумеваемые).
Тем не менее, у меня будет один результат предварительного просмотра любого изображения, которое понравилось человеку с его последней датой / отметкой времени, и все их личные изображения с их соответствующей меткой даты / времени. Теперь его простое соединение обратно в таблицу изображений, чтобы захватить детали (через псевдоним «i2»), и мы можем сортировать по столбцу PreQuery.MostRecent, а затем по значению идентификатора изображения по убыванию.
SELECT i2.* from ( select iml.image_id as id, max( iml.YourTimeStamp ) as MostRecent from image_likes iml where iml.user_id = '1' group by iml.image_id UNION ALL select i.id, i.ImageTimeStamp as MostRecent from images i left join image_likes iml2 on i.id = iml2.image_id and iml2.user_id = '1' where i.user_id = '1' and i.upload_type in ( 4, 3 ) and iml2.image_id is null ) PreQuery JOIN Images i2 on PreQuery.id = i2.id order by PreQuery.MostRecent, PreQuery.ID desc
Почему вы не используете «OR»?
сюда :
SELECT * FROM images WHERE images.id IN (SELECT image_id FROM image_likes WHERE user_id = '1') OR (images.user_id = '1' AND upload_type in (4,3)) ORDER BY id DESC
SELECT * FROM ( SELECT im.* , li.timestamp AS ts FROM images AS im JOIN image_likes AS li ON li.image_id = im.image_id WHERE li.user_id = 1 UNION ALL SELECT * , timestamp AS ts FROM images WHERE user_id = 1 AND upload_type in (4,3) ) AS tmp ORDER BY ts DESC