Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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
Mysql SQL查询以获取每个可能的链接_Mysql_Sql - Fatal编程技术网

Mysql SQL查询以获取每个可能的链接

Mysql SQL查询以获取每个可能的链接,mysql,sql,Mysql,Sql,我有一个方案,有三个表,结构如下 donuts (name: string, price: integer) grocery (no: string, gname: string, credit: integer) distributor (dname: string, gno: string, deliverydate: date) distributor.dname和distributor.gno是引用甜甜圈和杂货店的外键,它们分别是name和no 我在尝试写两个问题时遇到问题: 我试

我有一个方案,有三个表,结构如下

donuts (name: string, price: integer) 
grocery (no: string, gname: string, credit: integer) 
distributor (dname: string, gno: string, deliverydate: date)
distributor.dname和distributor.gno是引用甜甜圈和杂货店的外键,它们分别是name和no 我在尝试写两个问题时遇到问题:

  • 我试图查询每个“Vons”或“Smiths”杂货店所有甜甜圈的名字。(在gname中指定)
  • 我试过了

    SELECT d.name
    FROM donuts d, grocery g, distributor dd
    WHERE d.name = dd.cname
           AND dd.gno = g.no
           AND g.gname = 'Vons' OR g.gname = 'Smiths'
    
  • 我正在尝试查询至少两个不同甜甜圈共享的杂货店编号(杂货店中为否)
  • 我试过了

    SELECT g.no
    FROM donuts d, grocery g, distributor dd
    WHERE g.no = dd.gno 
    

    这似乎并不是每一次事件都会发生,也不是每一次事件都会发生。我如何解决我的问题?我对sql有点陌生,请原谅我的知识不足。

    尝试将最后一个或括号括起来,这样可能只是试图寻找您的密钥与vons连接,然后是smiths没有密钥连接

    SELECT d.name
    FROM donuts d, grocery g, distributor dd
    WHERE d.name = dd.cname
           AND dd.gno = g.no
           AND (g.gname = 'Vons' OR g.gname = 'Smiths')
    

    我猜您只需要正确地加入
    表:

    SELECT DISTINCT d.name
    FROM grocery g
    LEFT JOIN distributor dd
    ON dd.gno = g.no
    LEFT JOIN donuts d 
    ON d.name = dd.cname
    WHERE g.gname = 'Vons' OR g.gname = 'Smiths'
    
    1) 您在查询中使用AND和OR的组合,并且需要使用括号来指定,否则OR子句将不会按照您的意图进行解释。使用括号的示例:

    SELECT d.name
    FROM donuts d, grocery g, distributor dd
    WHERE d.name = dd.cname
           AND dd.gno = g.no
           AND ( g.gname = 'Vons' OR g.gname = 'Smiths' )
    
    在上面的示例中,括号确保OR操作仅在两个gname值之间,而不是gname='Smiths'和where子句的其余部分之间

    2) 假设数据只有每个杂货店-分销商-甜甜圈关系的一个实例,并且每个杂货店只从一个分销商获取每个甜甜圈类型,那么您应该能够计算行数并应用HAVING子句来查找存在两个或多个关系的位置:

    SELECT g.no, COUNT(*) as Quantity
    FROM distributor dd, grocery g, donuts d
    WHERE dd.dname = d.name
    AND dd.gno = g.no
    GROUP BY g.no
    HAVING COUNT(*) >= 2
    

    在Vons和Smith出售的甜甜圈

    无需从
    donuts
    表中进行选择,因为我们只需要从表中选择donauts名称,我们也可以在
    distributor
    中找到这些名称

    因此,我们从
    杂货店
    中选择以获取门店编号,并使用这些编号在
    分销商
    中查找数据名。我们按甜甜圈的名字分组,简单地数一数他们的商店

    select dname
    from distributor
    where gno in (select no from grocery where gname in ('Vons', 'Smiths'))
    group by dname
    having count(distinct gno) = 2;
    
    如果
    dname
    +
    gno
    distributor
    中是唯一的,您可以用
    count(*)替换
    count(不同的gno)

    至少销售两种不同甜甜圈的商店

    您的第二个查询转换为

    select g.no
    from donuts d
    cross join grocery g
    inner join distributor dd on dd.gno = g.no
    
    有适当的连接。所以你要先把所有的甜甜圈和所有的杂货结合起来。然后你把这些乘以商店里分发的所有甜甜圈

    你真正想要的是

    select gno
    from distributor
    group by gno
    having count(distinct dname) > 1;
    

    再次,不需要查询任何其他表;所有需要的信息都在
    distributor

    中。你应该为外键引用使用Id值,而不是字符串值。你使用的是什么服务器
    mysql
    sql
    ?sql是一种语言,而不是服务器。我不认为这是真的,但这与这个问题并没有太大关系,因为它明显地被标记为mysql。@Alex:这完全是胡说八道。SQL问题应该用SQL和DBMS标记,这里就是这样。其他数据库问题将用DBMS标记,而不是SQL。这会返回每个甜甜圈名称吗?离开第一个,如果我只想检查每个商店中甜甜圈的名称,我会省略最后一个and语句?只是试着去理解。每个结果都是对的?是的,没错。WHERE子句包含表之间的链接(“连接”)和筛选条件(用于gname)。这实际上是一种较旧的SQL编写方式,现在比较流行的方式是在FROM子句中将表之间的链接作为连接条件编写,并且WHERE子句只包含过滤条件—问题的另一个答案就是这种查询方式的示例。