我有一个赞美诗实例数据库,它们出现在各种赞美诗书中。 该表的设置大致如下:
CREATE TABLE `Hymns` (
`HymnID` int(11) unsigned NOT NULL AUTO_INCREMENT,
`HymnbookID` int(11) DEFAULT NULL,
`HyNumber` int(11) DEFAULT NULL,
`HyName` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`HyFirstLine` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`HyFirstLineDif` tinyint(1) NOT NULL DEFAULT '0',
`SongID` int(11) DEFAULT NULL,
`TextID` int(11) DEFAULT NULL,
`TuneID` int(11) DEFAULT NULL,
PRIMARY KEY (`HymnID`),
KEY `HymnbookID` (`HymnbookID`),
KEY `SongID` (`SongID`)
) ENGINE=MyISAM AUTO_INCREMENT=134381 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `Hymns` (`HymnID`, `HymnbookID`, `HyNumber`, `HyName`,
`HyFirstLine`, `HyFirstLineDif`, `SongID`, `TextID`, `TuneID`)
VALUES (642, 1, 26, 'Joseph Smith’s First Prayer',
'Oh, how lovely was the morning', 1, 26, 26, 26);
有时第一行是相同的,但在不同的地方切断 - 有时它们是不同的(字母 A 和 B 不在数据库中,我只是将它们放入以显示相同和不同):
Oh, how lovely was the morning [A]
Oh, how lovely [A]
Oh, how lovely was the morning! Radiant beamed [A]
O how lovely was the morning! [B]
是否可以仅返回唯一第一行的最长版本,如下所示?:
Oh, how lovely was the morning! Radiant beamed [A]
O how lovely was the morning! [B]
这是我到目前为止的查询:
SELECT HyFirstLine
FROM Hymns
WHERE TextID = 26 AND HyFirstLine IS NOT NULL
GROUP BY HyFirstLine
编辑:数据作为字典列表返回到Python。根据评论,也许用Python进行事后过滤更好?我不确定我会如何去做。添加Python标签。
最佳答案
编辑:这是针对 MSSQL,而不是 mySQL。我很抱歉。希望下面的引用资料可以帮助您。
未经测试,但您可能需要一个具有如下内容的存储过程:
DECLARE @HyFirstLine varchar(255);
DECLARE @StoredHyFirstLine varchar(255);
DECLARE @OutputTable Table(HyFirstLine varchar(255))
DECLARE hy_cursor CURSOR FOR
SELECT HyFirstLine FROM Hymns;
OPEN hy_cursor;
FETCH NEXT FROM hy_cursor
INTO @HyFirstLine;
WHILE @@FETCH_STATUS = 0
BEGIN
IF NOT EXISTS(SELECT * FROM @OutputTable WHERE HyFirstLine like @HyFirstLine+'%')
BEGIN
INSERT INTO @OutputTable(HyFirstLine) VALUES(@HyFirstLine)
END
ELSE
BEGIN
SET @StoredHyFirstLine = (SELECT HyFirstLine FROM @OutputTable WHERE HyFirstLine like @HyFirstLine+'%')
IF LEN(@HyFirstLine) > LEN(@StoredHyFirstLine)
BEGIN
UPDATE @OutputTable SET HyFirstLine = @HyFirstLine WHERE HyFirstLine like @HyFirstLine+'%'
END
END
FETCH NEXT FROM hy_cursor
INTO @HyFirstLine;
END
CLOSE hy_cursor;
DEALLOCATE hy_cursor;
SELECT * FROM @OutputTable
关于python - 如何对不同长度的 "identical"字符串进行 GROUP BY?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38628620/