好的,所以我一直在处理这个查询,我很确定必须有一种更好的方法来做这件事,而不是我当前的方法,即在彼此之间嵌套语句。
这是我的 2 个主表(快速重写,因此它们可能不是完美的“创建表”代码)
CREATE TABLE `person` (
`personid` INT PRIMARY KEY AUTO_INCREMENT,
`personuuid` VARCHAR(64),
`flags` INT,
`last_updated` DATETIME,
`first_name` VARCHAR(64),
`last_name` VARCHAR(64)
);
CREATE TABLE `person_status` (
`person_statusid` INT PRIMARY KEY AUTO_INCREMENT,
`person_statusesid` INT,
`personuuid` VARCHAR(64),
`groupsuuid` VARCHAR(64),
`start_date` DATE
);
简要说明:如您所见,一个人可以(可能)拥有多种状态。最新状态由开始日期(以最长的开始日期为准)确定。每个人还可能在人员表中具有多个条目。(帮助跟踪更新用户信息)最新信息将是具有最新 last_updated 值的信息。
我正在尝试做的事情:我正在尝试获取所有人的列表(又名 personuuid),以便:
- 返回给我们的条目具有最新的人员状态
- 状态仅显示特定的 groupsuuid(又名按组过滤)
- 我们还需要额外的过滤,以便过滤名称
- 我们还需要确保 flags 等于 0
这是我正在运行的查询:
SELECT personuuid FROM (
SELECT personuuid, flags FROM (
SELECT DISTINCT personuuid, flags
FROM person
JOIN (
SELECT personuuid, t2.person_statusesid FROM (
SELECT personuuid, groupsuuid, t1.person_statusesid FROM (
SELECT personuuid, groupsuuid, p1.person_statusesid
FROM person_status as p1
ORDER BY start_date DESC, person_statusid DESC
) as t1
GROUP BY personuuid, groupsuuid
) as t2
WHERE groupsuuid='xxxxxxxxxx' AND person_statusesid = X
) AS t3 USING (personuuid)
WHERE (first_name LIKE '%TEST%' OR last_name LIKE '%TEST%')
ORDER BY person_statusesid, last_name, first_name, last_updated DESC
) as t4
GROUP BY personuuid
) as t5
WHERE flags <> 2;
如您所见,我正在做的是将人员表与对人员状态进行排序的表连接起来,然后按组和 statusesid 进行过滤。然后我使用两个连接的表,按名称过滤,然后我尝试获取最近的人员行并确保它具有正确的标志。
我想,因为这似乎是一个有趣的难题,所以我想请你们看看是否有人能想出一个像样的解决方案。我不是这些事情的最专家,所以我只知道更多基本的 SQl 命令,所以任何建议都会是有益的。谢谢 =)