Проблема с объединением столбцов на основе идентификатора строки в SQL - PullRequest
0 голосов
/ 15 октября 2018

Мне нужно объединить столбцы comment на основе строки с именем столбца ID У меня был SQL-запрос, чтобы объединить ответы на комментарии с учётом значений счетчиков в ответных сообщениях, т. Е. comment_counts.Мне требуется отображать вложенные комментарии в одной ветке из поста новостной ленты.Ниже мой SQL-запрос

SELECT DISTINCT ft.ID as ID, ft.userid, ft.content, ft.timestamp, ft.comments as comment_counts, ftc.comment, ftc.timestamp as comment_timestamp, uq.username, uq.avatar 
FROM users uq, feed_item ft 
LEFT JOIN feed_item_comment ftc ON ftc.postid = ft.ID 
LEFT JOIN user_friends uf ON uf.friendid = ftc.userid 
LEFT JOIN users u ON u.ID = uf.friendid WHERE uq.ID = ft.userid AND ft.userid
IN 
(SELECT u.ID FROM users u WHERE u.ID 
    IN (SELECT uf.friendid FROM user_friends uf WHERE uf.status = '2' AND uf.userid = '".$this->user->info->ID."') 
        OR 
        u.ID 
        IN (SELECT uf.userid FROM user_friends uf WHERE uf.status = '2' AND uf.friendid = '".$this->user->info->ID."') 
        OR
        u.ID = '".$this->user->info->ID."'
) ORDER BY ft.ID DESC, ftc.timestamp DESC

Фактический результат:

Этот результат был получен из вышеуказанного запроса

ID  userid      content                 timestamp   comment_counts  comment         comment_timestamp       username        avatar   
___________________________________________________________________________________________________________________________________________

3   1           This is manju           13:12:31        2           manju comment   13:17:31                manju           1698862132.png   
3   1           This is manju           13:12:31        2           new cmt         14:00:15                manju           1698862132.png   
2   14          How are you doing?      13:06:42        2           Fine            15:00:15                Nishanth        default.png   
2   14          How are you doing?      13:06:42        2           Not Good        15:05:10                Nishanth        default.png   
1   14          How are you?            14:07:00        2           Look Good       20:00:00                Nishanth        default.png   
1   14          How are you?            14:07:00        2           So I'm!         20:10:00                Nishanth        default.png  

Для одного поста новостей с несколькими комментариями, отображаемыми в отдельных каналах с вложенными комментариями.Хотя вложенные комментарии отображались неоднократно.Но с отдельной веткой новостей

Ожидаемый результат :

ID  userid  content             timestamp   comment_counts  comment1        comment1_timestamp  comment2    comment2_timestamp  username    avatar   
_______________________________________________________________________________________________________________________________________________________

3   1       This is manju       13:12:31        2           manju comment   13:17:31            new cmt     14:00:15            manju       1698862132.png   
2   14      How are you doing?  13:06:42        2           Fine            15:00:15            Not Good    15:05:10            Nishanth    default.png   
1   14      How are you?        14:07:00        2           Look Good       20:00:00            So I'm!     20:10:00            Nishanth    default.png   

Мне нужно отображать только вложенные комментарии (не повторяются) только с однимотдельное сообщение в виде веткиНапример, для отдельной ленты новостей с сообщением «Как дела», как я прокомментировал с «Хорошо» и «Не хорошо»Для поста «Как дела» это повторяется дважды.Потому что я дважды прокомментировал тексты «Хорошо» и «Не хорошо»Как я должен предотвратить повторение вложенных комментариев в одной ленте новостей в виде потока.

Используя GROUP_CONCAT(ftc.comment) as replies

ID userid   content         timestamp     comment_counts   comment      comment_timestamp   username   avatar           replies  
__________________________________________________________________________________________________________________________________________________________________________

1   14      How are you?    14:07:00            2           Look Good   20:00:00            Nishanth   default.png   Look Good,Fine,Not Good,manju comment,new cmt,Look...

Полная база данных с запросом:

SQL Fiddle DEMO

Используя GROUP_CONCAT(ftc.comment) в качестве ответов

ID userid   content         timestamp     comment_counts   comment      comment_timestamp   username   avatar           replies  
__________________________________________________________________________________________________________________________________________________________________________

1   14      How are you?    14:07:00            2           Look Good   20:00:00            Nishanth   default.png   Look Good,Fine,Not Good,manju comment,new cmt,Look...

Как мне написатьSQL-запрос для объединения строк из результатов, полученных для получения желаемых / ожидаемых результатов?

1 Ответ

0 голосов
/ 15 октября 2018

Попробуйте ниже с использованием row_number () и условного агрегирования

DEMO

select id, userid,content,timestamp,comment_count,
min(case when seq=1 then comment end) as comment1,
min(case when seq=1 then comment_timestamp end) as commenttime1,
min(case when seq=2 then comment end) as comment2,
min(case when seq=2 then comment_timestamp end) as commenttime2
from
(
select *,row_number() over(partition by id,userid order by comment_timestamp) as seq from 
(SELECT DISTINCT ft.ID as ID, ft.userid, ft.content, ft.timestamp, ft.comments as comment_count, ftc.comment, ftc.timestamp as comment_timestamp, uq.username, uq.avatar FROM users uq,
feed_item ft 
LEFT JOIN feed_item_comment ftc ON ftc.postid = ft.ID
LEFT JOIN user_friends uf ON uf.friendid = ftc.userid 
LEFT JOIN users u ON u.ID = uf.friendid WHERE uq.ID = ft.userid AND ft.userid
IN 
(SELECT u.ID FROM users u WHERE u.ID 
IN (SELECT uf.friendid FROM user_friends uf WHERE uf.status = '2' AND uf.userid = 1) 
OR u.ID IN 
(SELECT uf.userid FROM user_friends uf WHERE uf.status = '2' AND uf.friendid = 1) 
OR
u.ID = 1
)ORDER BY ft.ID DESC, ftc.timestamp DESC)X)Y
group by id, userid,content,timestamp,comment_count
...