很抱歉,我不能用一句话来定义我需要什么,部分原因是我不完全理解这个问题,因为这种SQL超出了我的理解. 这是我在另一个帖子中发布的一个问题的扩展,该问题已被解决here
长话短说,我有一张挂锁桌子.每个挂锁都有一组打开它所需的特定锁.锁位于单独的表中.给定一个 keys 类型(可以打开特定的锁),我正在搜索可以用 keys 解锁的所有可能的锁(请注意,像"KL,KL"这样的双锁不能用只能解锁一个"KL"的 keys 解锁.所以,我让这一切运转起来(多亏了@danBlack)
所以,看一看公认的答案,我有以下几点
挂锁表
create table paddocks (
pd char(1),
sz enum('Small', 'Big'),
key (sz));
insert into paddocks values
('A', 'Small'),
('B', 'Small'),
('C', 'Small'),
('D', 'Small'),
('E', 'Small'),
('F', 'Big')
锁表
create table locks (
pd char(1),
lk char(2),
key (pd,lk));
insert into locks values ('A', 'KL'),('A', 'OK'),('A', 'CZ'),('A', 'CZ'),
('B', 'OK'),('B', 'OK'),
('C', 'OK'),('C', 'CZ'), ('C', 'KL'),
('D', 'RO'),('D', 'CZ'), ('D', 'CZ'),
('E', 'OK'),('E', 'OK'), ('E', 'KL'), ('E', 'KL'),
('F', 'OK'),('F', 'OK'), ('F', 'CZ'), ('F', 'KL');
一把 keys
create temporary table ky (
lk char(2),
key (lk));
insert into ky values
('KL'),('OK'),('CZ'),('OK'),('CZ')
目标是找到所有离被给定 keys 打开只有一把锁的挂锁.特别是,我需要在结果中显示挂锁"D",因为它需要一个"RO"锁,而给定的 keys 没有,但它是"1锁距离"被打开的.
SELECT pd
FROM
(SELECT pd,
p.lk,
p.c,
count(ky.lk) AS kc
FROM
(SELECT pd,
locks.lk AS lk,
count(locks.lk) AS c
FROM paddocks
JOIN locks USING (pd)
WHERE sz = 'Small'
GROUP BY pd,
locks.lk) p
LEFT JOIN ky USING (lk)
GROUP BY pd,
lk) p
GROUP BY pd
HAVING count(pd) = sum(c <= kc)
这将返回挂锁"A"、"B"和"C",因为它们都可以用给定的 keys 打开.缺少的是挂锁"D",它需要"RO"锁. 我想,根据参数的不同,我需要完全匹配(就像它目前正在工作),或者完全匹配+带有"1-lock away"的匹配.)