如何从列列表中选择唯一的记录,我们需要用特定的对来保护记录



我需要帮助在MySQL中查询以下问题。

这是我的桌子。我们有mType与成员类型(mType(相似的人的姓名。成员与mType P&S。有些成员可以在P边有S,有些则没有。门牌号码对于所有P记录都是唯一的,因此S记录后面的P记录将具有相同的门牌号码。如果我们认为P是父,S是子,那么parent&儿子住在同一所房子里,所以有同样的房子。我们需要从P&S对,或者如果P没有S,则按最新日期顺序将记录添加到表中。

在这里,一个HouseNo在表中显示了两次,所以我们只需要为这些记录和其他唯一记录选择具有最后日期的记录。

mType | mindex    | HouseNo  |     date     |   Name
---------------------------------------------------
P    |    1     |  111     |  2022-02-10  |  Addy
S    |    1     |  111     |  2022-02-10  |  March
P    |    2     |  222     |  2022-02-15  |  Joy
S    |    2     |  222     |  2022-02-15  |  Gorge
P    |    3     |  321     |  2022-02-10  |  Akhil
P    |    4     |  423     |  2022-02-10  |  Rose
P    |    5     |  111     |  2022-03-10  |  Addy
S    |    5     |  111     |  2022-03-10  |  March
P    |    6     |  111     |  2022-03-08  |  Addy
S    |    6     |  111     |  2022-03-08  |  March

例如,我需要以下结果:这里我们没有从日期"开始的重复记录;2022-02-10""2022-03-08";同一栋111号的房子。因此,在这里,我们挑选了所有HouseNo记录的最新日期和同时配对。

mType | mindex    | HouseNo  |     date     |   Name
---------------------------------------------------
P    |    2     |  222     |  2022-02-15  |  Joy
S    |    2     |  222     |  2022-02-15  |  Gorge
P    |    3     |  321     |  2022-02-10  |  Akhil
P    |    4     |  423     |  2022-02-10  |  Rose
P    |    5     |  111     |  2022-03-10  |  Addy
S    |    5     |  111     |  2022-03-10  |  March

我试了很多次,最后我提出了这个问题。这里,id是表的主键。我使用的是mysql 5.7版本。

SELECT
*
FROM
`member_details` t
WHERE
t.id =(
SELECT
MAX(t2.id)
FROM
member_details t2
WHERE
t.name = t2.name AND t.HouseNo = t2.HouseNo
)

但在这里,我无法挑选最新的唱片。这个查询给了我重复记录数中的最后一条记录,从而得出结果。而Addy和March有记录;2022-03-10";已在表中可用。

mType | mindex    | HouseNo  |     date     |   Name
---------------------------------------------------
P    |    2     |  222     |  2022-02-15  |  Joy
S    |    2     |  222     |  2022-02-15  |  Gorge
P    |    3     |  321     |  2022-02-10  |  Akhil
P    |    4     |  423     |  2022-02-10  |  Rose
P    |    5     |  111     |  2022-03-08  |  Addy
S    |    5     |  111     |  2022-03-08  |  March

这是表上的MySQL版本。

CREATE TABLE `member_details` (
`id` int(11) NOT NULL,
`mType` enum('P','S') NOT NULL,
`mIndex` int(11) NOT NULL,
`date` datetime NOT NULL,
`Name` varchar(10) NOT NULL,
`HouseNo` varchar(5) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Dumping data for table `member_details`
--
INSERT INTO `member_details` (`id`, `mType`, `mIndex`, `date`, `Name`, `HouseNo`) VALUES
(1, 'P', 1, '2022-02-10 00:00:00', 'Addy', '111'),
(2, 'S', 1, '2022-02-10 00:00:00', 'Mark', '111'),
(3, 'P', 2, '2022-02-10 00:00:00', 'Joy', '222'),
(4, 'S', 2, '2022-02-10 00:00:00', 'Gorge', '222'),
(5, 'P', 3, '2022-02-10 00:00:00', 'Akhil', '232'),
(6, 'P', 4, '2022-02-10 00:00:00', 'Rose', '324'),
(7, 'P', 5, '2022-03-10 00:00:00', 'Addy', '111'),
(8, 'S', 5, '2022-03-10 00:00:00', 'Mark', '111'),
(9, 'P', 6, '2022-03-08 00:00:00', 'Addy', '111'),
(10, 'S', 6, '2022-03-08 00:00:00', 'Mark', '111');
--
-- Indexes for dumped tables
--
--
-- Indexes for table `member_details`
--
ALTER TABLE `member_details`
ADD PRIMARY KEY (`id`);

令人困惑的是,您提供的样本数据插入与样本数据/所需结果不同,但我相信以下任一项都适用于您-如果您可能有重复的日期,并且需要在mIndex上使用关联子查询来过滤每个组的最大日期,则使用后者:

select * 
from member_details d
where date = (
select max(date) from member_details d2 
where d2.houseno = d.houseno
);
select * 
from member_details d
where date = (
select date from member_details d2 
where d2.houseno = d.houseno 
order by date desc, mIndex desc limit 1
);

参见MySql fiddle

最新更新