Mysql 检查主键SQL是否不存在行

Mysql 检查主键SQL是否不存在行,mysql,sql,select,Mysql,Sql,Select,我有四张桌子 每个蛋糕上正好有3个小点和1个糖霜 我想查询数据库,得到所有有1块糖霜和3块糖霜的蛋糕,其中糖霜和任何糖霜都没有消耗='1' 因此,让我们用psuedo插入数据: 插入冰桌(香草,0),(巧克力,0) 现在我有香草糖衣和红色、蓝色、绿色的糖衣,还有巧克力糖衣和橙色、紫色、粉色的糖衣 当我运行查询时,我希望它返回 CAKES cake1 cake2 只有当蛋糕中没有已消耗的部分时,所以即使一个洒点被标记为已消耗,我也希望从查询中忽略整个蛋糕。 下面的查询正是针对结冰的查询 SELE

我有四张桌子

每个蛋糕上正好有3个小点和1个糖霜

我想查询数据库,得到所有有1块糖霜和3块糖霜的蛋糕,其中糖霜和任何糖霜都没有消耗='1'

因此,让我们用psuedo插入数据: 插入冰桌(香草,0),(巧克力,0)

现在我有香草糖衣和红色、蓝色、绿色的糖衣,还有巧克力糖衣和橙色、紫色、粉色的糖衣

当我运行查询时,我希望它返回

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