Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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 查询只返回一个值,它应该返回2_Mysql_Sql - Fatal编程技术网

Mysql 查询只返回一个值,它应该返回2

Mysql 查询只返回一个值,它应该返回2,mysql,sql,Mysql,Sql,我有以下表格 CREATE TABLE `Customer` ( `CID` varchar(10) CHARACTER SET latin1 NOT NULL DEFAULT '', `Name` varchar(40) CHARACTER SET latin1 NOT NULL DEFAULT '', `City` varchar(40) CHARACTER SET latin1 NOT NULL DEFAULT '', `State` varchar(40) CHARACTER SET l

我有以下表格

CREATE TABLE `Customer` (
`CID` varchar(10) CHARACTER SET latin1 NOT NULL DEFAULT '',
`Name` varchar(40) CHARACTER SET latin1 NOT NULL DEFAULT '',
`City` varchar(40) CHARACTER SET latin1 NOT NULL DEFAULT '',
`State` varchar(40) CHARACTER SET latin1 NOT NULL DEFAULT '',
 PRIMARY KEY (`CID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin;

CREATE TABLE `LineItem` (
`LID` varchar(10) NOT NULL DEFAULT '',
`OID` varchar(10) NOT NULL DEFAULT '',
`PID` varchar(110) NOT NULL DEFAULT '',
`Number` int(11) DEFAULT NULL,
`TotalPrice` decimal(10,2) DEFAULT NULL,
PRIMARY KEY (`LID`),
KEY `Order ID` (`OID`),
CONSTRAINT `Order ID` FOREIGN KEY (`OID`) REFERENCES `OrderItem` (`OID`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `OrderItem` (
`OID` varchar(10) NOT NULL DEFAULT '',
`CID` varchar(10) NOT NULL DEFAULT '',
PRIMARY KEY (`OID`),
KEY `CID` (`CID`),
CONSTRAINT `CID` FOREIGN KEY (`CID`) REFERENCES `Customer` (`CID`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `Product` (
`PID` varchar(10) NOT NULL DEFAULT '',
`ProductName` varchar(40) DEFAULT '',
`Price` decimal(10,2) DEFAULT NULL,
 PRIMARY KEY (`PID`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
我一直试图在查询中运行它,以便成功地让它执行以下操作:

列出纽瓦克所有客户购买的产品

列出仅由纽瓦克客户订购的产品

对于5,我尝试了以下查询:

Select product.productname
From Customer as c INNER JOIN OrderItem as o
ON c.CID = o.CID
INNER JOIN LineItem line
ON o.OID = line.OID
Inner Join Product product
ON line.PID = product.PID
Where C.City = 'Newark'
Having Count(product.productname) > 1;
但它只返回一个值,应该返回2,除非我没有正确使用它

对于6,我理解这个概念,但不知道如何在SQL中减去表


第一个问题的目标是列出每个人从纽瓦克购买的常见物品。因此,如果人员A购买了项目X、Y和Z,人员B购买了W、V和Y,则查询将返回项目Y。

您需要添加分组依据。试试这个:

   Select product.productname
   From Customer as c 
   INNER JOIN OrderItem as o ON c.CID = o.CID
   INNER JOIN LineItem line ON o.OID = line.OID
   Inner Join Product product ON line.PID = product.PID
   Where C.City = 'Newark'
   Group by product.productname
   Having Count(*) > 1;

我想我的评论就是答案

Having Count(product.productname) > 1;

HAVE需要group by才能正常工作,因为它是聚合上的筛选器,而聚合需要group by。90%的数据库引擎会显式返回一个错误,说明它需要一个group by…但是MySQL更喜欢做错误的事情,而不是向您返回一个错误。这就是为什么您得到一行…MySQL做了一个group by,不管它感觉如何。在产品名称上添加一个“我假设”分组,该分组应与您在此处拥有的内容一起使用。

另外两个答案指出,如果您想要拥有,则需要一个“分组”。但您的问题实际上并没有提出问题或解释您的查询应该返回什么。你的问题或评论没有解释清楚。你写了一篇评论,我有两个来自纽瓦克的人,他们试图展示他们购买的物品[产品?]。但是,如果您的查询仅通过分组更正,那么它将计算错误的计数

一个问题是,您应该返回PID,也许还应该返回ProductName。您需要列出产品。PIDs作为键与产品的比例大概为1:1,但ProductName不是键,因此产品名称与产品的比例不是1:1。ProductName甚至可以为空。因此,选择ProductName并不能获得所有相关产品。行项目中的PID也应为外键

另一个问题是,您应该使用PID按产品分组。ProductName不是产品的密钥。因此,两种产品可以有相同的名称。因此,您将获得每个产品名称的计数,而不是每个产品的计数。Plus ProductName可以为空。即使只返回带有这些计数的产品的名称而不是PID,也需要按PID分组

另一个问题是计数错误。按PID分组对可以通过组合产品的Newark客户行、OrderItem行和LineItem行来创建的行进行分组。这些组合行由COUNTPID计数。但你需要的是那些行中的不受欢迎的纽瓦克客户的数量。您可以通过子选择来实现这一点,但恰好有一种更短的方法

SELECT p.PID, p.ProductName
FROM Customer c
JOIN OrderItem AS o ON c.CID = o.CID
JOIN LineItem l ON o.OID = l.OID
JOIN Product p ON l.PID = p.PID
WHERE c.City = 'Newark'
GROUP BY (p.PID)
HAVING COUNT(DISTINCT c.CID) > 1;
在目标1的部分条件发生更改后,您将获得对目标1的查询

HAVING COUNT(DISTINCT c.CID)
    = (SELECT COUNT(*) FROM Customer WHERE City='Newark')

除SQL标准外,关系代数减/差对应于。但是MySQL没有。您可以改为使用。

帮助步骤1是一个更好的问题标题。请重新阅读您发布的内容,并思考一下谁会阅读以及为什么。一个好的标题是获得你想要的答案的关键。所以我为你做了第一次尝试。我试图让所有重复的条目显示出来。我有两个来自纽瓦克的人,他们试图展示他们购买的物品;这就是你试图用以限制2条记录的原因吗?如果是这样,那就错了。having子句是聚合上的过滤器,需要一个groupby来工作……任何其他数据库都会返回一个错误,但是MySQL很高兴地做了错误的事情,而不是返回错误。从上面的评论中…尝试添加一个组,因为共有5条记录。其中3项记录是唯一的。我想要的是3条记录中的两条,重复列出的记录。