2

我有 2 个表,第一个表我希望它显示所有结果,没有“位置”或任何限制它的东西。

第二个表我想将一个 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

我尝试过使用子查询、左连接、右连接、内连接、子查询连接、分组,十有八九我得到了我应该得到的 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

使用子查询而不是加入

4

2 回答 2

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;
于 2013-07-18T17:34:04.273 回答
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;     
于 2014-01-15T06:55:48.207 回答