как заказать результаты LEFT JOIN - PullRequest
0 голосов
/ 05 февраля 2019

Мой запрос LEFT JOIN работает нормально, но я столкнулся с проблемой при упорядочении результатов запроса.

Запрос:

SELECT * 
FROM posts 
LEFT JOIN comments ON posts.postId = comments.commentId 
ORDER BY postDate DESC, commentDate DESC

Вместо комментариев тянутся в конце моего списка.

POSTS

postId (Primary)    int(11)      AUTO_INCREMENT
postUserId          int(11)
postType            varchar(10)
postContent         text
postCaption         text
postState           varchar(10)
postVotes           int(11)
postDate            datetime

И комментарии

commentId (Primary) int(11)     AUTO_INCREMENT
commentUserId       int(11)
commentFor          varchar(20)
commentForId        int(11)
commentContent      text
commentState        varchar(20)
commentVotes        int(11)
commentDate         datetime

Из комментариев не упорядочены должным образом Необработанные данные, извлеченные из базы данных, сначала извлеченные из комментариев

"1","1","post","1","this is one comment and the only one","published","1","2019-02-05 12:04:00"

И это из сообщений

"1","1","text","this is the first post",,"published","1","2019-02-05 12:02:00"
"2","1","text","this is the second post",,"published","1","2019-02-05 12:16:00"

Желаемый результатдолжно быть как

"2","1","text","this is the second post",,"published","1","2019-02-05 12:16:00"
"1","1","post","1","this is one comment and the only one","published","1","2019-02-05 12:04:00"
"1","1","text","this is the first post",,"published","1","2019-02-05 12:02:00"

Упорядочено по дате / времени

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Ваши JOIN условия являются подозрительными:

posts.postId = comments.commentId 

Это предполагает, что должны совпадать идентификаторы с очень разными именами.

Предположительно, вы намереваетесь:

SELECT p.*, c.*   -- you should list the columns you want
FROM posts p LEFT JOIN
     comments c
     ON p.postId = c.postId 
ORDER BY p.postDate DESC, c.commentDate DESC;

Я не уверен на 100%, что это исправит вашу логику упорядочения, но это должно по крайней мере вернуть более разумный набор результатов.Тем не менее, я хотел бы сохранить посты в порядке по почте, а также по дате, поэтому я бы использовал:

ORDER BY p.postDate DESC, p.postid, c.commentDate DESC;

Это будет держать комментарии к постам, которые имеют одинаковый postDate вместе.

0 голосов
/ 05 февраля 2019

Сначала

Во-первых, у вас есть ошибка в вашем условии соединения.

Итак, каждый пост и каждый комментарий имеют уникальный первичный ключ.Это означает, что вы не можете присоединиться к postId с commentId, потому что в сообщении может быть много комментариев ... и для каждого комментария нужен свой идентификатор.

Итак, правильное условие:

SELECT * 
FROM posts 
LEFT JOIN comments ON posts.postId = comments.commentForId 
ORDER BY postDate DESC, commentDate DESC

UNION with NestedЗапрос и порядок

Теперь, чтобы объединить и упорядочить результаты комментариев и сообщений, необходимо использовать вложенный запрос и UNION.

Пример:

select * from

(select postId as entryId, postContent as content, postDate as timestamp from posts
UNION
select commentId, commentContent, commentDate from comments)temp

ORDER BY temp.timestamp DESC;

С данными:

create table posts(
  postId int,
  postContent text,
  postDate datetime
  );

  create table comments(
    commentId int,
    commentForId int,
    commentContent text,
    commentDate datetime);

    insert into posts values (1, 'this is the first post', "2019-02-05 12:02:00");
    insert into posts values (2, 'this is the second post', "2019-02-05 12:16:00");

    insert into comments values (1, 1, 'this is the comment', "2019-02-05 12:04:00");      

См. Скрипку: https://www.db -fiddle.com / f / koRapukYqcSxWLNQ8hSA7Y / 0

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