我有五个表;客户端,第一节,第二节,第三节,第四节。每个表都会从输入数据时自动填充第一个字段中的client_id。我想检索站点上特定客户端的每个表(第一节、第二节、第三节、第四节(的百分比字段。我的查询工作并检索每个表的百分比字段,但不幸的是,它一直为数据库中的第一个客户端返回此字段,例如 client_id 1。如何更改下面的查询,以便获得当前客户端返回的百分比?非常感谢您的帮助。罗西
$query = "SELECT a.client_id,
a.percent,
b.percent,
c. percent,
d. percent
FROM sectionone a,
sectiontwo b,
sectionthree c,
sectionfour d
WHERE a.client_id = b.client_id
AND b.client_id = c.client_id
AND c.client_id = d.client_id";
从您的问题中判断您的sectionone
、sectiontwo
等表是否为每个客户端恰好有一行。
可能的情况是这些。
- 精确的
client
和sectionone
之间的一对一关系等。
一 - 到零或一关系 一
- 到零一或多关系
从你问题的字里行间读到,在我看来,你相信你有第一种情况,但你实际上有第三种情况。 也就是说,特定客户端 ID 可能有多个sectionthree
行。
结果集中需要的是每个客户端的单行,如下所示。
clientid one two three four
123 45 55 20 56
对于此类查询来说,清楚地可视化所需的结果集非常重要。但你知道的。
所以,我们开始了。 我们需要逐个汇总sectionX
表,因为我们必须营造一种错觉,即它们每个客户端只有一行,即使它们没有。
SELECT client_id, AVG(percent) AS percent
FROM sectionone
GROUP BY client_id
同一查询适用于所有四个sectionX
表。我们将使用其中四个摘要查询作为其余主查询的虚拟表。
接下来,我们必须将这四个摘要查询联接到client
表中。我们应该使用 LEFT JOIN 命令来涵盖特定客户端的sectionX
表可能包含零行的情况。
SELECT z.client_id, a.percent AS one, b.percent AS two,
c.percent AS three, d.percent AS four
FROM client as z
LEFT JOIN (
SELECT client_id, AVG(percent) AS percent
FROM sectionone
GROUP BY client_id
) AS a ON z.client_id = a.client_id
LEFT JOIN (
SELECT client_id, AVG(percent) AS percent
FROM sectiontwo
GROUP BY client_id
) AS b ON z.client_id = b.client_id
LEFT JOIN (
SELECT client_id, AVG(percent) AS percent
FROM sectionthree
GROUP BY client_id
) AS c ON z.client_id = c.client_id
LEFT JOIN (
SELECT client_id, AVG(percent) AS percent
FROM sectionfour
GROUP BY client_id
) AS d ON z.client_id = d.client_id
最后,如果您只需要一个client_id,则应以
WHERE z.client_id = whatever
如果客户端的sectionX
表中有多个行,则此方法采用其值的平均值。如果您需要其他内容,例如 MAX、MIN 等,则可以在查询中改用它。
这看起来很复杂,但实际上很简单,如果你能调用一个五向表左连接简单:-(。 它适用于本答案开头提到的所有三种情况。
更重要的是,MySQL(和其他SQL系统(在优化这种查询方面做得很好,因为它很常见。
$query = "SELECT a.client_id,
a.percent,
b.percent,
c. percent,
d. percent
FROM sectionone a,
sectiontwo b,
sectionthree c,
sectionfour d
WHERE a.client_id = b.client_id
AND b.client_id = c.client_id
AND c.client_id = d.client_id
AND a.client_id = 1
";
感谢您的帮助,我现在有了有效的答案:
$query = "SELECT a.client_id,
a.percent,
b.percent,
c. percent,
d. percent
FROM sectionone a,
sectiontwo b,
sectionthree c,
sectionfour d
WHERE a.client_id = b.client_id
AND b.client_id = c.client_id
AND c.client_id = d.client_id
添加了其他代码
ORDER BY client_id DESC";
这将为当前用户提供结果。很开心,罗茜