如何从我们需要用特定对保护记录的列列表中 select 唯一记录?
How to select unique records from the list of columns where we need to secure records with certain pair?
我在 MySQL 中需要帮助解决以下问题。
这是我的table。我们有 Name of people with mType 类似于成员的类型 (mType)。成员与 mType P & S 配对。有些成员可以在 P 旁边有 S,有些则没有。门牌号对于所有 P 记录都是唯一的,因此 S 记录后面的 P 记录将具有相同的门牌号。如果我们将 P 视为 parent,将 S 视为儿子,则 Parent 和儿子住在同一所房子,因此具有相同的 houseNo。我们需要取出所有带有 P 和 S 对的记录,或者如果 P 没有 S,则将记录按最新日期顺序添加到 table。
这里有一个HouseNo在table中出现了两次,所以我们只需要为这些记录选择最新日期的记录,其余的唯一记录。
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
例如,我需要这些结果:
这里我们没有相同 HouseNo 111 的日期“2022-02-10”和“2022-03-08”的重复记录。所以在这里我们选择了所有具有最新日期和同时对的 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
是 table 的主键。我正在使用 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”的记录已经在 table.
中可用
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
这是 table 上的 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`);
令人困惑的是,您提供的示例数据插入与示例 data/desired 结果不同,但我相信以下任何一项都适合您 - 如果您可以有重复的日期并且需要 tie-break 在 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 中需要帮助解决以下问题。
这是我的table。我们有 Name of people with mType 类似于成员的类型 (mType)。成员与 mType P & S 配对。有些成员可以在 P 旁边有 S,有些则没有。门牌号对于所有 P 记录都是唯一的,因此 S 记录后面的 P 记录将具有相同的门牌号。如果我们将 P 视为 parent,将 S 视为儿子,则 Parent 和儿子住在同一所房子,因此具有相同的 houseNo。我们需要取出所有带有 P 和 S 对的记录,或者如果 P 没有 S,则将记录按最新日期顺序添加到 table。
这里有一个HouseNo在table中出现了两次,所以我们只需要为这些记录选择最新日期的记录,其余的唯一记录。
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
例如,我需要这些结果: 这里我们没有相同 HouseNo 111 的日期“2022-02-10”和“2022-03-08”的重复记录。所以在这里我们选择了所有具有最新日期和同时对的 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
是 table 的主键。我正在使用 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”的记录已经在 table.
中可用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
这是 table 上的 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`);
令人困惑的是,您提供的示例数据插入与示例 data/desired 结果不同,但我相信以下任何一项都适合您 - 如果您可以有重复的日期并且需要 tie-break 在 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
);