您如何从具有排他性的参考表中进行选择?

时间:2017-05-21 07:21:18

标签: database postgresql

我有两张桌子(|------------------------| | id | name | | 1 | group1 | | 2 | test group | |------------------------| |---------------------------------| | id | user | thread | |---------------------------------| | 1 | 1 | 1 | | 2 | 2 | 1 | | 3 | 1 | 2 | | 4 | 2 | 2 | | 5 | 3 | 2 | |---------------------------------| )。本质上,线程是具有名称的对象,然后user_thread将用户链接到线程。这是为了说明多对多的关系。

鉴于此设置,我试图找出如何在两个用户之间获取线程。

线程看起来像这样

$querystring = '
PREFIX : <http://www.semanticweb.org/user/ontologies/2016/karya_ilmiah#>
SELECT ?judulNaskah ?linkNaskah
WHERE { ?naskah :judulNaskah ?judulNaskah. filter regex(str(?judulNaskah),"Sistem Informasi Manajemen"). 
?naskah :linkNaskah ?linkNaskah} ORDER BY ?judulNaskah';
$result=$model->sparqlQuery($querystring,"HTML");
echo $result;

user_threads看起来像这样

   function checkCheckbox(){
 $('#numOfTrans').hide();
 $('#daysOfInactivity').hide();
$("#targetPointDiv").hide();
$("#targetTransactionDiv").hide();
$("#fixedTimeDiv").hide();
$("#isNumOfTrans").hide();

if ($('#irregular').is(":checked")) {
    $('#daysOfInactivity').show();
} else {

    $("#targetPointDiv").show();
    $("#targetTransactionDiv").show();
    $("#fixedTimeDiv").show();
    $("#isNumOfTrans").show();
}
if ($('#isNumOfTrans').is(":checked")) {
    $('#numOfTrans').show();
} 
}

所以我遇到的问题是这个 - 给定用户1和用户2,我想返回它们独有的共同线程。

使用1和2查询应返回线程1.我尝试使用自联接和混合排除,但SQL不在我的主要技能组中。有没有办法做到这一点,还是我需要重组我的桌子?

1 个答案:

答案 0 :(得分:1)

一种方法是选择让两个用户都使用JOIN的线程,然后排除其中包含其他用户的所有线程。

SELECT ut1.thread FROM user_threads ut1
  JOIN user_threads ut2 ON ut1.thread=ut2.thread
  WHERE ut1."user" = 1 AND ut2."user" = 2
    AND NOT EXISTS
     (SELECT 1 FROM user_threads WHERE thread=ut1.thread AND "user" NOT IN (ut1."user", ut2."user"))

SQL Fiddle