微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么会出现这个sql查询错误?也许有另一种方式来写这个?

如何解决为什么会出现这个sql查询错误?也许有另一种方式来写这个?

我正在为一个项目使用 Chinook 数据库我有两个难以执行的查询,但都出现错误

  1. 我正在查找发送到“纽约”并包含属于多个流派的曲目的所有订单(发票)。 [InvoiceId,产品数量,total1,total2]。 Total1 应该是单价*数量,total2 是总计。它应该只显示 2 行。 到目前为止,我已经想出了这个。我也尝试过使用左连接、完全外连接等进行切换
CREATE TEMPORARY TABLE temp AS
SELECT * 
FROM track join invoiceline USING (TrackId) 
WHERE (select * from track t1 where EXISTS (select * from track t2 where t1.GenreId <> t2.GenreId));

SELECT invoice.InvoiceId,invoiceline.Quantity,invoiceline.UnitPrice*invoiceline.Quantity,invoice.Total 
FROM (SELECT * FROM invoice JOIN invoiceline 
WHERE invoice.BillingCity LIKE '%New York%') JOIN temp cc ON invoiceline.TrackId
GROUP BY invoiceline.InvoiceId;

DROP TABLE temp;

它提供了错误

操作数应包含 1 列

  1. 我正在寻找购买了两首以上相同曲目的客户(成对)。它应该提供 14 行。 到目前为止,我已经想出了这个。
SELECT CONCAT(FirsTNAME,',LASTNAME) AS name1 FROM customer
JOIN invoice ON customer.CustomerId = invoice.CustomerId
JOIN invoiceline ON invoice.InvoiceId = invoiceline.InvoiceId
JOIN track ON invoiceline.TrackId = track.TrackId
UNION
(
SELECT CONCAT(FirsTNAME,LASTNAME) AS name2 FROM customer
JOIN invoice ON customer.CustomerId = invoice.CustomerId
JOIN invoiceline ON invoice.InvoiceId = invoiceline.InvoiceId
JOIN track ON invoiceline.TrackId = track.TrackId
);

所以 A) 有谁知道为什么它会提供该错误? B) 任何人都可以提供任何提示或建议编写这些查询的更好方法吗?

这里有两个有用的架构:ER diagram relational diagram

解决方法

回答你的第一个问题: 出现错误是因为许多行都有一个流派 ID。这种方法也是非常多余的。 您应该使用流派 ID 计数并跟踪计数大于 1 的轨道 ID,如下所示:

CREATE TEMPORARY TABLE temp AS
SELECT * 
FROM track join invoiceline USING (TrackId) 
WHERE TrackId in 
(select TrackId from (select TrackId,count(distinct GenreId) as genres from track group by 1 having genres>1));

SELECT invoice.InvoiceId,invoiceline.Quantity,invoiceline.UnitPrice*invoiceline.Quantity,invoice.Total 
FROM (SELECT * FROM invoice JOIN invoiceline 
WHERE invoice.BillingCity LIKE '%New York%') JOIN temp cc ON invoiceline.TrackId
GROUP BY invoiceline.InvoiceId;

DROP TABLE temp;

我假设轨道 ID 是这里的主键。

对于第二个问题,我假设您要查找购买相同记录的客户。您可以使用如下查询:

SELECT invoiceline.TrackId,group_concat(customer.CustomerId) as customers FROM customer
JOIN invoice ON customer.CustomerId = invoice.CustomerId
JOIN invoiceline ON invoice.InvoiceId = invoiceline.InvoiceId
JOIN track ON invoiceline.TrackId = track.TrackId
group by 1

这将为您提供购买相同曲目的逗号分隔客户 ID。此外,使用客户 ID 而不是名字和姓氏,因为某些客户可能具有相同的名称。最好使用主键。

既然您提到过,您希望客户成对购买相同的记录,我建议您阅读使用 apriori 算法的购物篮分析或关联分析。您可以将您的数据集导入到 R 或 Python 中,并构建可视化效果。 Python 速度更快,可以处理更多数据,但它的可视化效果很差。 R 在处理大量数据时有点慢,但对 apriori 算法有很好的可视化

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。