content_id と geography_id の 2 つの列を含むテーブルがあり、複数の地域にタグ付けされた多くのコンテンツ ID があります。特定の地域にタグ付けされ、他の地域にはタグ付けされていないコンテンツ ID のみを取得するにはどうすればよいですか。
ティア、アンキット
content_id と geography_id の 2 つの列を含むテーブルがあり、複数の地域にタグ付けされた多くのコンテンツ ID があります。特定の地域にタグ付けされ、他の地域にはタグ付けされていないコンテンツ ID のみを取得するにはどうすればよいですか。
ティア、アンキット
このようなものがあなたが探しているものかもしれません:
select content_id
from the_table
group by content_id
having count(distinct geography_id) = 1
and max(geography_id) = 126 -- this is the geography_id you are looking for
2 つの ID に対してこれを行うと、ステートメントが少し変わります。
select content_id
from the_table t1
where geography_id in (11,12)
group by content_id
having count(distinct geography_id) = 2
正確にこれら 2 つの geography_idで region_id を取得する必要がある場合は、もう少し複雑です。
select t1.content_id
from the_table t1
where t1.geography_id in (11,12)
group by t1.content_id
having count(distinct t1.geography_id) = 2
and count(distinct t1.geography_id) = (select count(*)
from the_table t2
where t2.content_id = t1.content_id)
または代替手段として:
select content_id
from the_table
where geography_id = 11
intersect
select content_id
from the_table
where geography_id = 12
minus -- this would be intersect for any other DBMS
select content_id
from the_table
group by content_id
having count(distinct geography_id) > 2;
SQLFiddle の例: http://sqlfiddle.com/#!4/35823/7
これはかなり簡単だと思います。レコードをグループ化し、(は 1 に等しい必要がcontent_ID
あります )の数を数えるだけです。geography_id
SELECT content_ID
FROM TableName
GROUP BY content_ID
HAVING COUNT(DISTINCT geography_id) = 1 AND
MAX(geography_id) = 'specific tag'
繰り返さない contentId のみを意味する場合
select contentid
from mytable
group by contentid
having count(*)=1
これにより、1 つの geoghraphyId のみにマップされた contentId が返されます。
@a_horse_with_no_name そうです、私の答えは間違っていました。
正解は
SELECT content_id
from TableName
where content_id in (
SELECT content_ID
FROM TableName
WHERE geography_id in (11)
)
group by content_id
having count(distinct geography_id)=1