我有两张桌子
表1:用户
列id
,Name
,institution
机构是一个显示机构名称的刺痛。
表2:机构。
列id
,institution
,count
我需要count
列来记录表1中的行数,其中institution
与表2中每行的institution
相同。这应该适用于所有表2中的行。
请帮助我获得正确的MySQL查询或表关系来实现此目的。
答案 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操作。