Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite 返回在列中具有相同项的不同名称对_Sqlite_Relational Division - Fatal编程技术网

Sqlite 返回在列中具有相同项的不同名称对

Sqlite 返回在列中具有相同项的不同名称对,sqlite,relational-division,Sqlite,Relational Division,我想在表中找到不同的名称对,它们在items列中具有相同的精确项。例如: CREATE TABLE t ( name VARCHAR(255), item VARCHAR(255) ); INSERT INTO t VALUES("Alice", "Orange"); INSERT INTO t VALUES("Alice", "Pear"); INSERT INTO t VALUES("Alice", "Lemon"); INSERT INTO t VALUES(

我想在表中找到不同的名称对,它们在items列中具有相同的精确项。例如:

CREATE TABLE t
(
    name    VARCHAR(255),
    item    VARCHAR(255)
);

INSERT INTO t VALUES("Alice", "Orange");
INSERT INTO t VALUES("Alice", "Pear");
INSERT INTO t VALUES("Alice", "Lemon");
INSERT INTO t VALUES("Bob", "Orange");
INSERT INTO t VALUES("Bob", "Pear");
INSERT INTO t VALUES("Bob", "Lemon");
INSERT INTO t VALUES("Charlie", "Pear");
INSERT INTO t VALUES("Charlie", "Lemon");
这里的答案是爱丽丝,鲍勃,因为他们拿的是完全相同的东西

我想用NOT EXISTS/NOT进行双重否定,我认为这更适合这个问题,但我想不出任何接近功能的东西


这有点类似于问题,但我使用的是SQLite,所以我不能使用GROUP_CONCAT,但我想知道如何使用关系划分(使用NOT EXISTS/NOT IN)来完成。我可能已经找到了解决您问题的方法。我的是使用MySQL测试的,但它没有使用GROUP_CONCAT。它可能适用于您的SQLite数据库。我的查询用于查找购买相同物品的人

尝试使用以下语句: 从t e1、t e2中选择不同的e1.name、e2.name,其中e1.item=e2.item和e1.name!=e2.按e1命名组。计数*大于1的项目;


这似乎适用于SQLLite

    select t1.name
    from t t1
        join t t2 on t1.name <> t2.name and t1.item = t2.item 
        join (select name, count(*) as cnt from t group by name) t3 on t3.name = t1.name
        join (select name, count(*) as cnt from t group by name) t4 on t4.name = t2.name
    group by t1.name, t3.cnt, t4.cnt
    having count(*) = max(t3.cnt, t4.cnt)

要获取所有名称对之间的公共项目数,可以使用以下查询:

SELECT t1.name AS name1, t2.name AS name2, COUNT(*) AS cnt
FROM t AS t1
INNER JOIN t AS t2 ON t1.item = t2.item AND t1.name < t2.name
GROUP BY t1.name, t2.name
现在,您只需要过滤掉计数不等于name1和name2项数的name1和name2对。可以使用具有相关子查询的HAVING子句执行此操作:

SELECT t1.name AS name1, t2.name AS name2
FROM t AS t1
INNER JOIN t AS t2 ON t1.item = t2.item AND t1.name < t2.name
GROUP BY t1.name, t2.name
HAVING COUNT(*) = (SELECT COUNT(*) FROM t WHERE name = t1.name) AND 
       COUNT(*) = (SELECT COUNT(*) FROM t WHERE name = t2.name)
与:

使用NOT IN是可能的,bit以更复杂的方式表达完全相同的机制:

SELECT t1.name, t2.name
FROM t AS t1, t AS t2
GROUP BY t1.name, t2.name
HAVING t1.name < t2.name
   AND NOT EXISTS (SELECT item
                   FROM t
                   WHERE name = t1.name
                     AND item NOT IN (SELECT item
                                      FROM t
                                      WHERE name = t2.name))
   AND NOT EXISTS (SELECT item
                   FROM t
                   WHERE name = t2.name
                     AND item NOT IN (SELECT item
                                      FROM t
                                      WHERE name = t1.name));

我给你做了一把SQLFiddle在这里玩~你的桌子上可以有多少不同的东西?@TimBiegeleisen,你想要多少就有多少。我认为它不会影响任何东西,只要它仍然可以返回包含完全相同的项集的对@队长,好吧,我的错,但我真的很想得到一些提示,在不使用集体协商的情况下解决这个问题。。。
SELECT t1.name, t2.name
FROM t AS t1, t AS t2
GROUP BY t1.name, t2.name
HAVING t1.name < t2.name
   AND NOT EXISTS (SELECT item FROM t WHERE name = t1.name
                   EXCEPT
                   SELECT item FROM t WHERE name = t2.name)
   AND NOT EXISTS (SELECT item FROM t WHERE name = t2.name
                   EXCEPT
                   SELECT item FROM t WHERE name = t1.name);
SELECT t1.name, t2.name
FROM t AS t1, t AS t2
GROUP BY t1.name, t2.name
HAVING t1.name < t2.name
   AND NOT EXISTS (SELECT item
                   FROM t
                   WHERE name = t1.name
                     AND item NOT IN (SELECT item
                                      FROM t
                                      WHERE name = t2.name))
   AND NOT EXISTS (SELECT item
                   FROM t
                   WHERE name = t2.name
                     AND item NOT IN (SELECT item
                                      FROM t
                                      WHERE name = t1.name));