Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php从五个表中选择查询,每个表的第一个字段中都有client_id_Php_Mysql_Sql - Fatal编程技术网

php从五个表中选择查询,每个表的第一个字段中都有client_id

php从五个表中选择查询,每个表的第一个字段中都有client_id,php,mysql,sql,Php,Mysql,Sql,我有五张桌子;客户,第一部分,第二部分,第三部分,第四部分。从输入数据开始,每个表在第一个字段中自动填充客户机id。 我想为站点上的特定客户机检索每个表的百分比字段(Section1、Section2、Section3、Section4)。我的查询工作并检索每个表的百分比字段,但不幸的是,它一直为数据库中的第一个客户端(例如client_id 1)返回该字段。 如何更改下面的查询,以便获得当前客户端返回的百分比?非常感谢你的帮助。罗西 $query = "SELECT a.client_id,

我有五张桌子;客户,第一部分,第二部分,第三部分,第四部分。从输入数据开始,每个表在第一个字段中自动填充客户机id。 我想为站点上的特定客户机检索每个表的百分比字段(Section1、Section2、Section3、Section4)。我的查询工作并检索每个表的百分比字段,但不幸的是,它一直为数据库中的第一个客户端(例如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
等表是否为每个客户机恰好有一行

可能的情况如下

  • 客户机
    第一部分
    之间建立精确的一对一关系,等等
  • 一对零或一关系
  • 一对零一或多关系
  • 从你问题的字里行间看,在我看来,你认为你有第一种情况,但实际上你有第三种情况。也就是说,对于一个特定的客户端id,您可能有多个
    第三节

    您希望在结果集中为每个客户端显示一行,如下所示

      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。本主题中有一些很好的教程。