2016-11-23 2 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 ok、何か解決策はありますか? –

+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

urの時間をありがとう、 –

+0

最終的に私は答えを得た select b.book_name、c.publisher_name、( ( '1'、 '4'))、COUNT(*)from mas_bk_accession_entry a mas_book_titleにbとしてb.id = a.title_idを結合する join a.publisher_id = 1、author_ids = '1,5'、a.title_id = 3 グループby b.book_name、b.id、c.publisher_name book_name | publisher_name | author_names | count ---------- + --- ------------ + ------------- + ------ jhon、siva | | jhon、siva | | jhon、siva | 2 –

関連する問題