2013-11-26 76 views
1

我有三个表,它们共享一个公共字段(our_id)。MySQL:从两个表中获取结果,在第三个中计数匹配

our_id是Table1中的主键。

our_id在表2和表3中也存在零次或多次。

我想选择其中our_id同时存在于表1和表2的记录,但我还需要指望有多少次our_id发生在表3(甚至只是是否our_id存在,或者未在表3)。

我想出了这一点:

SELECT Table1.*, Table2.*, COUNT(Table3.*) AS table3_count 
FROM Table1, Table2, Table3 
WHERE Table1.our_id = Table2.our_id 
AND Table1.our_id = Table3.our_id; 

...但如果our_id存在于表3,它可以这样做,只是返回结果。

所以,我想:

SELECT Table1.*, Table2.*, COUNT(Table3.*) AS table3_count 
FROM Table1, Table2, Table3 
WHERE Table1.our_id = Table2.our_id 
    AND (Table1.our_id = Table3.our_id 
     OR NOT EXISTS (SELECT * FROM Table3 
         WHERE Table1.our_id=Table3.our_id)); 

但是,这只是跑啊跑......

我需要它仍然返回结果,其中同时存在于表1和表2 our_id,并且告诉我有多少次(或是否)存在于Table3中。

预先感谢您!

回答

2

您应该使用LEFT JOIN来引入表3。 LEFT JOIN返回左表(表1)中的所有行,并尝试匹配右表(表3)中的行。如果Table3没有任何匹配的行,则为选定的Table3字段返回NULL。

SELECT Table1.*, Table2.*, t3.count 
FROM Table1, Table2 
LEFT JOIN (SELECT our_id, COUNT(*) AS count FROM Table3 GROUP BY our_id) t3 
ON Table1.our_id = t3.our_id 
WHERE Table1.our_id = Table2.our_id 
+0

这听起来是正确的!我刚刚尝试过,并且出现错误:'#1054 - 'on clause'中的未知列'Table1.our_id',但该表和字段完全存在(我已经检查了十几次拼写现在!)。 – JoLoCo

+0

是否正确?你可能想尝试给所有的表别名来解决这个问题。 '从Table1 t1,Table2 t2',然后使用'ON t1.our_id = t3.our_id'。我不知道什么可能是错的,但也许这两件事中的一件会帮助你。 –

+0

啊,我明白了!我必须在“FROM”行的Table1和Table2之间进行交换(所以第二行读取'FROM Table2,Table1')。非常感谢您的帮助,我非常感谢。 – JoLoCo

相关问题