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
我在尝试写两个问题时遇到问题:
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子句只包含过滤条件—问题的另一个答案就是这种查询方式的示例。