简化大规模的mysql查询

时间:2011-02-20 19:31:53

标签: mysql union

我目前有3个名为报告,用户和客户的表

报告分别有5个字段:

report_id INT,
user_id INT (FK to users on user_id)
client_id INT (FK to clients on client_id)
create_date DATE
description TEXT

用户分别有4个字段

user_id INT
username VARCHAR
password VARCHAR
parent_id INT (FK to users on user_id)

客户分别有3个字段

client_id INT
firstname VARCHAR
lastname VARCHAR

如您所见,允许用户拥有父用户(某种管理员)。 我想获取父用户和普通用户创建的所有报告并显示它们。 我已经想出了一个查询来做到这一点,但它非常庞大。

例如:获取ID为4的父用户的所有报告及其所有儿童报告。

(SELECT c.firstname, c.lastname, r.report_id, r.date, u.name 
 FROM clients c, reports r, users u 
 WHERE u.users_id=4 
 AND r.user_id = u.users_id 
 AND c.client_id = r.client_id) 
UNION 
(SELECT c.firstname, c.lastname, r.report_id, r.date, u.name 
 FROM clients c, reports r, users u 
 WHERE u.parent_id=4 
 AND r.user_id = u.users_id 
 AND c.client_id = r.client_id);

有没有办法简化此查询? 我很幸运能搞清楚。

提前致谢;

3 个答案:

答案 0 :(得分:2)

您可以使用 OR ,因为2个查询几乎完全相同

SELECT * 
FROM clients c, reports r, users u 
WHERE r.user_id = u.users_id 
  AND c.client_id = r.client_id
  AND (u.users_id=4 OR u.parent_id=4)

答案 1 :(得分:1)

怎么样:

SELECT firstname, lastname, report_id, date, name
FROM   clients NATURAL JOIN reports NATURAL JOIN users
WHERE  users_id=4 OR parent_id=4

答案 2 :(得分:0)

有没有人听说过加入?

SELECT
   firstname, lastname, report_id, date, name
FROM
   clients
   JOIN reports USING (client_id)
   JOIN users USING (report_id)
WHERE
   user_id = ?
   OR parent_id = ?