如何解决为什么会出现这个sql查询错误?也许有另一种方式来写这个?
我正在为一个项目使用 Chinook 数据库,我有两个难以执行的查询,但都出现错误。
- 我正在查找发送到“纽约”并包含属于多个流派的曲目的所有订单(发票)。 [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 列
- 我正在寻找购买了两首以上相同曲目的客户(成对)。它应该提供 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 举报,一经查实,本站将立刻删除。