我试图将用户返回的结果限制为“最近”的结果,但在用户有父母的情况下,我还需要返回父母。
CREATE TABLE `users` (
`id` int(0) NOT NULL,
`parent_id` int(0) NULL,
`name` varchar(255) NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `times` (
`id` int(11) NOT NULL,
`time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `users`(`id`, `parent_id`, `name`) VALUES (1, NULL, 'Alan');
INSERT INTO `users`(`id`, `parent_id`, `name`) VALUES (2, 1, 'John');
INSERT INTO `users`(`id`, `parent_id`, `name`) VALUES (3, NULL, 'Jerry');
INSERT INTO `users`(`id`, `parent_id`, `name`) VALUES (4, NULL, 'Bill');
INSERT INTO `users`(`id`, `parent_id`, `name`) VALUES (5, 1, 'Carl');
INSERT INTO `times`(`id`, `time`) VALUES (2, '2019-01-01 14:40:38');
INSERT INTO `times`(`id`, `time`) VALUES (4, '2019-01-01 14:40:38');
http://sqlfiddle.com/#!9/91db19
在这种情况下,我想返回 Alan、John 和 Bill,但不返回 Jerry,因为 Jerry 在times
表中没有记录,他也不是有记录的人的父母。我对如何处理卡尔犹豫不决,我不介意为他获得结果,但我不需要它们。
我正在用数十万条记录过滤成千上万的用户times
,因此性能很重要。一般来说,我有大约 3000 个唯一 id 来自times
可能是一个id
,或者一个parent_id
。
以上是我正在尝试做的一个精简示例,完整的示例包括更多连接和案例语句,但一般来说,上面的示例应该是我们使用的,但这里是我正在使用的查询示例(完整查询将近 100 行):
SELECT id AS reference_id,
CASE WHEN (id != parent_id)
THEN
parent_id
ELSE null END AS parent_id,
parent_id AS family_id,
Rtrim(last_name) AS last_name,
Rtrim(first_name) AS first_name,
Rtrim(email) AS email,
missedappt AS appointment_missed,
appttotal AS appointment_total,
To_char(birth_date, 'YYYY-MM-DD 00:00:00') AS birthday,
To_char(first_visit_date, 'YYYY-MM-DD 00:00:00') AS first_visit,
billing_0_30
FROM users AS p
RIGHT JOIN(
SELECT p.id,
s.parentid,
Count(p.id) AS appttotal,
missedappt,
billing0to30 AS billing_0_30
FROM times AS p
JOIN (SELECT missedappt, parent_id, id
FROM users) AS s
ON p.id = s.id
LEFT JOIN (SELECT parent_id, billing0to30
FROM aging) AS aging
ON aging.parent_id = p.id
WHERE p.apptdate > To_char(Timestampadd(sql_tsi_year, -1, Now()), 'YYYY-MM-DD')
GROUP BY p.id,
s.parent_id,
missedappt,
billing0to30
) AS recent ON recent.patid = p.patient_id
此示例适用于 Faircom C-Tree 数据库,但我还需要在 Sybase、MySql 和 Pervasive 中实现类似的解决方案,因此只是想了解我应该做什么才能获得最佳性能。
基本上我需要做的是以某种方式让RIGHT JOIN
用户也包括父母。