2017-03-07 90 views
-1

我对SQL有疑问。SQL选择多个表

我有3个表,消息,付款和报告。

我想从每个表在一个查询的用户的所有事件,所以这是笏我想了解:

SELECT * FROM messages WHERE receiver_id = 10 
SELECT * FROM payments WHERE client_id = 10 
SELECT * FROM reports WHERE receiver_id = 10 

但在1查询。

这可能吗?

Table structures: 
- messages 
id 
sender_id 
receiver_id 
type 
text 
created_at 
updates_at 

- payments 
id 
user_id 
client_id 
method 
cost 
status 
text 
created_at 
updated_at 

- reports 
id 
sender_id 
receiver_id 
text 
created_at 
updates_at 
+0

如果所有三个表都有关系,则使用JOINS。 – Viki888

+2

请显示表格结构,样本数据和预期结果。 – Jens

+0

在该示例中,receiver_id和client_id都等于10 - 是否可以安全地假设这些值构成表之间的关系? – RMathis

回答

0

一些细节如果之间没有关系3桌,那么你可以只使用UNION。它可以是如此简单:

SELECT receiver_id as event_id, event_name, event_description, event_timestamp FROM messages WHERE receiver_id = 10 
UNION 
SELECT client_id as event_id, event_name, event_description, event_timestamp FROM payments WHERE client_id = 10 
UNION 
SELECT receiver_id as event_id, event_name, event_description, event_timestamp FROM reports WHERE receiver_id = 10 

这是假设对面有,你有兴趣在所有表列的一组常见。然而,如果列有不同的名称,但包含相同的数据(和数据类型)。那么你可以使用AS重命名列的查询,实现UNION

SELECT receiver_id as event_id, col1 as event_name, col2 as event_description, col3 event_timestamp FROM messages WHERE receiver_id = 10 
UNION 
SELECT client_id as event_id, col_a as event_name, col_b as event_description, col_c event_timestamp FROM payments WHERE client_id = 10 
UNION 
SELECT receiver_id as event_id, col_x as event_name, col_y as event_description, col_z event_timestamp FROM reports WHERE receiver_id = 10 

记住UNION将消除在数据集中的重复行。如果这不是你想要的行为,那么改用UNION ALL(它不会消除重复)。

另请注意,如果列数据类型在整个表中不相同,则必须将它们转换为常用类型。 Casting高度依赖于您的DBMS,因此请确保您使用正确的方法来完成此操作。

+0

感谢这工作完美 – Mark

+0

为什么不'UNION ALL'而不是? – jarlh

+0

@jarlh根据要求(在问题中没有提供),“UNION ALL”也可以工作。这只取决于是否要在结果集中包含重复项。根据我的经验,我很少在这些类型的实例中使用重复项,除非需要另行指定,否则我总是默认为“UNION”。 – jordanwillis

0

其相当直截了当提供receiver_id和CLIENT_ID持有相同的价值观:

SELECT * FROM `messages` LEFT JOIN `payments` ON 
`messages`.`receiver_id` = `payments`.`client_id` LEFT JOIN `reports` 
ON `messages`.`receiver_id` = `reports`.`receiver_id` 
+0

那张桌子怎么样? – jarlh

+0

在op修改他的问题之前,它实际上只显示了“SELECT”的顶部部分。现在假设他们都存储相同的'ID'这将工作正常 – Option

+0

我会说全外连接。 (如果一个ID有付款但没有消息...) – jarlh

0

我真的不明白你想要什么,你想在1个查询中的所有数据,还是你需要加入他们?

如果你想在一个表中的所有数据你可以做到这一点,我认为:

SELECT * FROM messages as M, payments as P, reports as R 
WHERE M.receiver_id, P.client_id, R.receiver_id = 10 

否则,您需要向我们展示有关的关系

+0

语法错误... – jarlh

0

您可以使用Union或Union All连接3个查询的结果集。但是,所有3个表必须具有相同数量的列才能工作。发布您的表格结构以获得更精确的解决方案。

SELECT * FROM messages WHERE receiver_id = 10 
Union All 
SELECT * FROM payments WHERE client_id = 10 
Union All 
SELECT * FROM reports WHERE receiver_id = 10 
+0

相同数量的列 - 并匹配数据类型! – jarlh