如何使用同一个表中的一列来设置列的值是SQL查询的结果

时间:2014-06-30 20:42:36

标签: php mysql

我有两张桌子

表1:用户

idNameinstitution

机构是一个显示机构名称的刺痛。

表2:机构。

idinstitutioncount

我需要count列来记录表1中的行数,其中institution与表2中每行的institution相同。这应该适用于所有表2中的行。

请帮助我获得正确的MySQL查询或表关系来实现此目的。

3 个答案:

答案 0 :(得分:1)

Join instutions上的两个表格,并获得如下计数

select i.institution,
X.ins_count
from  Institutions i
left join
(
select institution,
count(*) as ins_count
from Users
group by institution
) X on i.institutions = X.institutions

答案 1 :(得分:0)

这个问题并没有很多细节,但据我所知,你只想做到这一点。

UPDATE TABLE institutions,
    (SELECT 
        i.id,
        COUNT(u.id) as user_count
    FROM Users u
    JOIN Institutions i on i.institution = u.institution
    GROUP BY i.institution) as temp
SET institutions.count = temp.user_count 
WHERE temp.id = institutions.id;

答案 2 :(得分:0)

我会做这样的事情:

UPDATE institutions i
  LEFT
  JOIN ( SELECT u.institution
              , COUNT(1) AS user_cnt 
           FROM users u
          GROUP BY u.institution
       ) c
    ON c.institution = i.institution
   SET i.count = IFNULL(c.user_cnt,0)

内联视图(别名为c)获取每个“机构”的用户数。这一结果与机构有着密切的联系。 (我们引用内联视图查询的结果,就像它是一个表; MySQL实际上将内联视图称为“派生表”。

我们将值user_cnt值分配给count列,并将0代入NULL(如果给定的“机构”中没有用户,则会发生这种情况。)

要在运行更新之前查看此操作,您可以运行类似的SELECT(删除SET子句并将UPDATE关键字更改为SELECT <expression_list> FROM,也可以添加ORDER BY条款。

SELECT i.institution
     , i.count               AS old_count
     , IFNULL(c.user_cnt,0)  AS new_count
  FROM institutions i
  LEFT
  JOIN ( SELECT u.institution
              , COUNT(1) AS user_cnt 
           FROM users u
          GROUP BY u.institution
       ) c
    ON c.institution = i.institution
 ORDER BY i.institution

作为实现相同结果的另一种可能方法,但是(可能)效率较低(如果这实际上有效),将使用相关子查询来返回值:

UPDATE institutions i
   SET i.count = ( SELECT COUNT(1) 
                     FROM users u
                    WHERE u.institution = i.institution
                 ) 

我知道这种方法在SELECT语句中“起作用”。我希望它在UPDATE语句中工作,但我没有测试过。等效SELECT将是:

SELECT i.institution
     , i.count AS old_count
     , ( SELECT COUNT(1) 
           FROM users u
          WHERE u.institution = i.institution
        ) AS new_count
  FROM institutions i

没有任何令人信服的理由使用相关子查询,我会避免这种情况,而是使用JOIN操作。