Sqlite 返回在列中具有相同项的不同名称对
我想在表中找到不同的名称对,它们在items列中具有相同的精确项。例如: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(
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));