2016-11-23 25 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 –