繁体   English   中英

将表格中的一行与多行联接

[英]Join one row from a table with multiple rows

这是有关mysql中查询的问题。 例如,让我们使用一个跟踪汽车销售的系统。 有一个带salespersons的表,一个sales表和一个将两者链接的表。 大多数情况下,每笔交易只有一个人与之相关。 但是有时会有多个人与一笔交易相关联。

Table sales
id | carId | date
---+-------+-----------
1  | 2     | 11-01-2011
2  | 8     | 11-02-2011
3  | 5     | 11-05-2011

Table link
personId | saleId
---------+-------
2        | 1 
2        | 2 
1        | 3
2        | 3

Table salesperson
id | name  | age
---+-------+----
1  | Barry | 25
2  | Sara  | 32

要检索数据,我想在网页中显示每笔交易的信息。 但是,当多个人与一项销售相关联时,就会出现问题。 我尝试在代码中应用下面的查询,此后,PHP处理了多个人与一项销售相关联的异常,但是由于销售表的长度,下面的查询需要太多时间才能运行:

SELECT count(personId) as amount, carId, date
FROM link 
JOIN salesperson ON link.personId = salesperson.id  
JOIN sales ON sales.id = link.saleId
GROUP BY link.saleId

有没有更有效的查询可以使用? 顺便说一下,表的索引已经完成。

然后就是:

SELECT STRAIGHT_JOIN
    amount, carId, date
FROM (
    SELECT saleId, count(*) as amount
    FROM link
    GROUP BY saleId
    ORDER BY NULL) as amounts
JOIN sales ON sales.id = amounts.saleId;

您为表格设置了正确的索引吗? 我不知道您的桌子有多大,但我无法想象这应该是一个很大的问题。

另外,您想从查询中得到什么结果? 似乎您正在尝试获取所有销售,然后计算涉及的销售人员有多少?

您的查询看起来还可以,但是您的分组依据有点奇怪...
尝试按所有非聚合列进行分组的标准方法,如下所示:

SELECT carId, date, name, age, count(personId) as amount
FROM link 
JOIN salesperson ON salesperson.id = link.personId
JOIN sales ON sales.id = link.saleId
GROUP BY 1,2,3,4;

我认为问题可能出在您使用链接表作为基表,而查询的数据库优化却不好。 尝试:

SELECT count(sp.personId) as amount, s.carId as carId, s.date as date, sp.name as name, sp.age as age  
FROM sales as s
JOIN link as l ON s.id = l.saleId
JOIN salesperson as sp ON l.personId = sp.id  
ORDER BY l.saleId

如果您关注性能方面,请避免使用Joins,尤其是在mysql中。 阅读本文,了解有效的编码技术, 网址为http://phpadvent.org/2011/a-stitch-in-time-saves-nine-by-paul-jones

对于您在第一个查询中遇到的问题,请在第二个查询中选择销售ID,从第三个查询中的链接表中选择personID,然后从人员表中选择所有人员。

如本文所述,在传递查询时使用IN子句。 它看起来很少冗长的编码,但是比在具有15k +行的表上使用join效率更高

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM