MySQL从另一个表加入计数匹配的记录

时间:2013-07-18 17:31:52

标签: mysql mysqli

我知道这个问题可能已被回答了数千次,但是我发现这个问题的每一个变化都不起作用。

我所拥有的是2个表,第一个表我希望它显示所有结果,没有“where”或任何限制它的内容。

第二个表我想将id与第一个表匹配,它可以有多行引用它,所以我想计算数字。

所以我要说第一个表是这样的:

ID - name
1  - one
2  - two
3  - three
4  - four

第二个表是这样的

ID - REF
1  - 1
2  - 1
3  - 2
4  - 2
5  - 3
6  - 3
7  - 4
8  - 4

我希望将它们组合起来:

ID - name - count
1  - one  - 2
2  - two  - 2
3  - three- 2
4  - four - 2

我尝试过使用子查询,左连接,右连接,内连接,子查询连接,分组以及9次中的9次我得到的结果是我得到的1300个结果中的第一个ID的20个结果。其余的我只得到一个不正确的计数而没有名字。

我觉得这是MySQL 101但是在尝试了多种变化并且没有任何结果之后我觉得必须有一些我不知道的东西。

我很乐意被引导到一个完全相同的情况下的问题(2个小时的查找,没有任何完全相同的工作)或者是一个简单的查询来指出这个方法的逻辑,谢谢你提前对于任何回答的人,你都会度过我的一天。

如果需要任何其他信息让我知道,我故意省略了查询,因为我已经多次调整它以使它没有太多相关性(我必须列出我尝试的每一个查询,这将是远滚动很多)

好的我已经测试了第一个和答案,它似乎在这种情况下工作所以我会扩展我的答案,问题是“回答”所以这只是一个扩展,如果没有回复我将关闭这个答案如下:

SELECT t.id, t.name, count(*) AS suppliers 
FROM #__tiresku AS t 
LEFT JOIN #__mrsp AS m ON t.name = m.tiresku_id 
GROUP BY t.id, t.name

扩展是一个内连接,我有另一个表更多的是一个列表,它有一个id和一个名字,就是这样,我引用带有id的表来获取“名称”。

这可能有更好的选择然后加入(如外键或其他东西)。

我已将此添加到选择b.name AS brand_name

加入INNER JOIN #__brands AS b ON t.brand = b.id

Worked with a sub query rather then join

2 个答案:

答案 0 :(得分:6)

这是聚合的基本联接:

select t1.id, t1.name, count(*) as `count`
from table1 t1 join
     table2 t2
     on t1.id = t2.ref
group by t1.id, t1.name;

答案 1 :(得分:0)

根据要求,该示例不包括第一个表中不在第二个表中的记录,但这可能是隐含的。

我倾向于在第二个表中创建一个嵌套的计数表,而不考虑“存在于第一个表中”,除非计数很大,然后探测变得更便宜。

我会先计算第二个表中的值,因为第一个表是描述的事实解码。

select ID, name, coalesce('count',0)

from (select ref, count(*) as 'count'
      from table2
      group by ref) as T2

right join table1

on ref = ID;