Hỏi về order by trong postgres

Chào anh chị group em có dữ liệu mẫu sau

  tag_id  |  tag_name 
     1    +     car    
     2    +   bicycle
     3    +     dog
     4    +     egg

Em truy vấn :

 select string_agg(tag_name,',' order by tag_name) as tags from tags

Xếp theo bảng chữ cái từ a->z và kết quả trả về:

bicycle,car,dog,egg

Tuy nhiên em muốn đưa 1 tag đặc biệt lên đầu của chuỗi ví dụ như “dog” , và các tag còn lại xếp theo bảng chữ cái ví dụ:

dog,bicycle,car,egg

Dạ mong anh chị giúp đỡ , em xin cảm ơn !

Mình thấy dùng concat là ok đấy

1 Like

Bạn thử lọc ra các tag đặc biệt trước, sau đó select các tag không đặc biệt còn lại và order by như bình thường. Ghép 2 kết quả dùng concat với separator là ','.

2 Likes

Có cách nào truy vấn 1 lần ko ạ ? Tại table “tags” này nối với table “posts” . Ví dụ mình select 20 posts và mỗi post như vậy kèm theo cột string tags như trên .

Bạn phải xác định các tag đặc biệt của bạn là gì trước chứ. Quy tắc quyết định tag nào đặc biệt của bạn là gì?

2 Likes

“tag đặc biệt” là tham số động . Mình muốn kiểu như :
Gọi t là tham số

select ... order by 
if column_tag_name == t :
   position = 1

Bạn có thể dùng subquery, đại ý như:

select
    t,
    (select string_agg(tag_name, ',' order by tag_name) from tags if tag_name != t) as tag_list
from tags;
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?