2016-11-23 74 views
-2

表1:mas_book_author連接表的列上用逗號分隔值

author_id | author_name  
------------+---------------- 
1   | jhon 
2   | roobini 
3   | virat 
4   | sachin 
5   | siva 
6   | priya 

表4:mas_bk_accession_entry

id(int)(pk) | author_ids(varchar) 
-------------+------------------- 
1   | 1,5 
2   | 5,1 
3   | 2,5 
4   | 3,5 
5   | 4,5 

我的結果應該是這樣的:

author_name |count 
------------+------ 
jhon,siva | 2  

這是我的SQL查詢

select b.author_name,COUNT(*) as totbook 
from mas_bk_accession_entry a 
    join mas_book_author as b 
    on b.author_id in (select cast((unnest(string_to_array(f.author_ids,','))) as int) as author_ids 
         from mas_bk_accession_entry f) 
where a.author_ids = '1,5' 
group by b.author_name 
+1

不要存儲逗號分隔值。您的查詢存在的問題是數據庫設計不好的直接結果 –

+0

@a_horse_with_no_name好的,有沒有解決方案? –

+1

https://en.m.wikipedia.org/wiki/Database_normalization - 讓你的數據庫3NF和你的生活會更容易 – Morishiri

回答

1

您可以簡化您的加入條件,你需要一個string_agg()來獲取作者姓名的逗號分隔的列表:

select string_agg(author_name,','), count(*) 
from mas_book_author b 
    join mas_bk_accession_entry e on b.author_id = any(string_to_array(author_ids,',')::int[]) 
where e.author_ids = '1,5'; 

在線例如:http://rextester.com/NVNBH72654

但你確實應該解決您的數據模型。存儲逗號分隔的值,如author_ids列是非常糟糕的選擇。

+0

感謝你的時間, –

+0

最後我得到了答案 select b.book_name,c.publisher_name,( ('','4')中的author_id,mas_bk_accession_entry的COUNT(*)a 將mas_book_title作爲b加入b.id = a.title_id 加入mas_book_publisher as c on c.id = a.publisher_id where a.publisher_id = 1 and author_ids ='1,5'and a.title_id = 3 group by b.book_name,b.id,c.publisher_name book_name | publisher_name | author_names | count ---------- + --- ------------ + ------------- + ------ jhon,siva | jhon,siva | jhon,siva | 2 –