Mysql 检查主键SQL是否不存在行
我有四张桌子 每个蛋糕上正好有3个小点和1个糖霜 我想查询数据库,得到所有有1块糖霜和3块糖霜的蛋糕,其中糖霜和任何糖霜都没有消耗='1' 因此,让我们用psuedo插入数据: 插入冰桌(香草,0),(巧克力,0) 现在我有香草糖衣和红色、蓝色、绿色的糖衣,还有巧克力糖衣和橙色、紫色、粉色的糖衣 当我运行查询时,我希望它返回Mysql 检查主键SQL是否不存在行,mysql,sql,select,Mysql,Sql,Select,我有四张桌子 每个蛋糕上正好有3个小点和1个糖霜 我想查询数据库,得到所有有1块糖霜和3块糖霜的蛋糕,其中糖霜和任何糖霜都没有消耗='1' 因此,让我们用psuedo插入数据: 插入冰桌(香草,0),(巧克力,0) 现在我有香草糖衣和红色、蓝色、绿色的糖衣,还有巧克力糖衣和橙色、紫色、粉色的糖衣 当我运行查询时,我希望它返回 CAKES cake1 cake2 只有当蛋糕中没有已消耗的部分时,所以即使一个洒点被标记为已消耗,我也希望从查询中忽略整个蛋糕。 下面的查询正是针对结冰的查询 SELE
CAKES
cake1
cake2
只有当蛋糕中没有已消耗的部分时,所以即使一个洒点被标记为已消耗,我也希望从查询中忽略整个蛋糕。
下面的查询正是针对结冰的查询
SELECT CAKE
FROM CAKETABLE as c
INNER JOIN (SELECT * FROM ICINGTABLE WHERE CONSUMED = '0') as i
ON c.ICING = i.ICING;
要不是洒了水,我就有麻烦了。如果使用与上述相同的技术,我的查询将返回:
CAKE
cake1
cake1
cake1
cake2
cake2
cake2
我可以使用DISTINCT消除这一点,但它仍然是不正确的,因为当我需要相反的功能时,如果任何Spreading已使用='0',它将在列表中显示该蛋糕(仅当所有Spreading已使用='0'时才显示蛋糕)
如果有人有更好的标题名称,我们将不胜感激。我想不出任何描述性和简短的东西。您可以使用
不存在
来要求不使用结冰或洒水:
select cake
from caketable c
where not exists
(
select *
from icingtable i
where i.cake = c.cake
and i.consumed = '1'
)
and not exists
(
select *
from sprinkletable s
where s.cake = c.cake
and s.consumed = '1'
)
假设一块蛋糕始终有三个喷水点,您可以
按
蛋糕分组,并使用HAVING
过滤没有三个未使用喷水点的蛋糕:
SELECT CAKE
FROM CAKETABLE as C
INNER JOIN (
SELECT * FROM ICINGTABLE WHERE CONSUMED = '0'
) as I ON C.CAKE = I.CAKE
INNER JOIN (
SELECT CAKE FROM SPRINKLETABLE
WHERE CONSUMED = '0'
GROUP BY CAKE
HAVING COUNT(*) = 3
) as S ON C.CAKE = S.CAKE;
我认为以下内容符合您的要求:
select ct.cake
from caketable ct join
reservedsprinkle rs
on ct.cake = rs.cake join
sprinkletable st
on rs.sprinkle = st.sprinkle join
icingtable it
on ct.cake = it.cake
where it.consumed = 0
group by ct.cake
having count(distinct rs.sprinkle) = 3 and
sum(case when st.consumed = 1 then 1 else 0 end) = 0
这是按蛋糕分组,然后将大多数条件放入HAVING子句中。通过数据库设计,看起来蛋糕只能有一层糖霜。我假设蛋糕在蛋糕表中是唯一的。ICINGTABLE(表一)没有蛋糕?你有N个c.CAKE=i.CAKE;,但在您提供的模式中,CAKE不是ICingTable中的列,CAKE是谎言。“也许是黑色台面?哈哈!那是个玩笑。”--GLaDOS@james31rock你是对的,我错了。它应该在结冰时接合,因为可凝固和结冰台都有结冰。
SELECT CAKE
FROM CAKETABLE as C
INNER JOIN (
SELECT * FROM ICINGTABLE WHERE CONSUMED = '0'
) as I ON C.CAKE = I.CAKE
INNER JOIN (
SELECT CAKE FROM SPRINKLETABLE
WHERE CONSUMED = '0'
GROUP BY CAKE
HAVING COUNT(*) = 3
) as S ON C.CAKE = S.CAKE;
select ct.cake
from caketable ct join
reservedsprinkle rs
on ct.cake = rs.cake join
sprinkletable st
on rs.sprinkle = st.sprinkle join
icingtable it
on ct.cake = it.cake
where it.consumed = 0
group by ct.cake
having count(distinct rs.sprinkle) = 3 and
sum(case when st.consumed = 1 then 1 else 0 end) = 0