php SELECT查询来自五个表,每个表在第一个字段中都有client_id

时间:2013-10-12 12:14:45

标签: php mysql sql

我有五张桌子;客户端,sectionone,sectiontwo,sectionthree,sectionfour。每个表在输入数据时自动填充第一个字段中的client_id。 我想检索站点上特定客户端的每个表(sectionone,sectiontwo,sectionthree,sectionfour)的百分比字段。我的查询工作并检索每个表的百分比字段,但不幸的是,它继续为数据库中的第一个客户端返回此值,例如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";

3 个答案:

答案 0 :(得分:1)

很难从您的问题中判断出您的sectiononesectiontwo等表格是否为每个客户提供了一行。

可能的情况是这些。

  1. clientsectionone等之间的精确一对一关系
  2. 一对一或零关系
  3. 一对一 - 一对多关系
  4. 在你的问题的界限之间阅读,我认为你相信你有第一种情况,但你实际上有第三种情况。也就是说,您可能有多个sectionthree行用于特定客户端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
    

    最后,如果您只想要一个client_id,则应使用

    结束查询
         WHERE z.client_id = whatever
    

    如果客户端的sectionX表中有多行,则此方法采用其值的平均值。如果你需要其他东西,比如MAX,MIN等,你可以在查询中使用它。

    这看起来很复杂,但实际上很简单,如果你可以简单地调用五向表LEFT JOIN :-)。它适用于本答案开头提到的所有三种情况。

    更重要的是,MySQL(和其他SQL系统)在优化这种查询方面做得非常好,因为它很常见。

答案 1 :(得分:0)

$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
";

答案 2 :(得分:0)

感谢您的帮助,我现在有了正确的答案:

$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";

这为当前用户提供了结果。非常高兴,罗西