mysql子表过滤父纪录,mysql - 当子匹配条件时选择父记录 - 堆栈内存溢出

我试图将用户的返回结果限制为“最近”的结果,但是在用户拥有父级的情况下,我还需要返回父级。

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');

在这种情况下,我希望回到艾伦,约翰和比尔,但不是杰里因为杰里没有在创纪录的times表,也不是他一个人与一个记录的父。 关于如何处理卡尔,我不知道如何处理他的结果,但我不需要他们。

我正在过滤成千上万的用户,记录数十万times ,因此性能非常重要。 总的来说,我有大约3000独特的ID从未来的times ,可能是要么一个id ,或parent_id 。

以上是我试图做的一个精简的例子,完整的包含更多的连接和case语句,但一般来说上面的例子应该是我们使用的,但这里是我正在使用的查询的示例(完整查询近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也包括用户父级。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值