php从五个表中选择查询,每个表的第一个字段中都有client_id
我有五张桌子;客户,第一部分,第二部分,第三部分,第四部分。从输入数据开始,每个表在第一个字段中自动填充客户机id。 我想为站点上的特定客户机检索每个表的百分比字段(Section1、Section2、Section3、Section4)。我的查询工作并检索每个表的百分比字段,但不幸的是,它一直为数据库中的第一个客户端(例如client_id 1)返回该字段。 如何更改下面的查询,以便获得当前客户端返回的百分比?非常感谢你的帮助。罗西php从五个表中选择查询,每个表的第一个字段中都有client_id,php,mysql,sql,Php,Mysql,Sql,我有五张桌子;客户,第一部分,第二部分,第三部分,第四部分。从输入数据开始,每个表在第一个字段中自动填充客户机id。 我想为站点上的特定客户机检索每个表的百分比字段(Section1、Section2、Section3、Section4)。我的查询工作并检索每个表的百分比字段,但不幸的是,它一直为数据库中的第一个客户端(例如client_id 1)返回该字段。 如何更改下面的查询,以便获得当前客户端返回的百分比?非常感谢你的帮助。罗西 $query = "SELECT a.client_id,
$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
等表是否为每个客户机恰好有一行
可能的情况如下
客户机
和第一部分
之间建立精确的一对一关系,等等第三节行
您希望在结果集中为每个客户端显示一行,如下所示
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
最后,如果您只需要一个客户机id,则应使用
WHERE z.client_id = whatever
如果客户机的sectionX
表中有多行,此方法将取其值的平均值。如果您需要其他内容,如MAX、MIN等,可以在查询中使用它
这看起来很复杂,但实际上很简单,如果您可以调用一个五向表LEFT JOIN simple:-)。它适用于本答案开头提到的所有三种情况
此外,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";
这将为当前用户提供结果。非常高兴,Rosie您应该添加一个客户id=$actual\u client\u id条件。非常感谢Lajos Veres。我要去试试,干杯,罗西埃罗又来了拉乔斯·维雷斯,你能告诉我你会如何添加你的建议吗?我尝试过各种变体,但不断收到错误消息。我显然不太擅长这个。我把它添加到a.client_id=actual_client_idI发布完整答案的地方。(注释不支持代码突出显示)你好,奥利,我只想检索一行上的一个客户端。因此,我试图在WHERE语句中添加a.client\u id=actual\u client\u id,但收到一条错误消息。你能说说这个WHERE语句应该是什么样子的吗?它是在其他条件之前还是之后?谢谢,RosieRosie,如果看不到您的整个WHERE语句,我就说不出哪里出了问题。谢谢您告诉我在哪里添加条件ie a.client_id=1。但我的问题是,它已经返回了第一个客户端,即使客户端x在网页上是实时的。我希望它返回的实际客户谁是在网页上。a.client_id=''会这样做吗?我可以用什么替换(1)?谢谢,RosieYou应该从某个地方知道哪个用户实际上在您的页面上。“通用”解决方案是登录用户,将用户id保存到会话中,并在这样的查询中使用保存的用户id。本主题中有一些很好的教程。