2016-07-28 59 views
0

我有一个赞美诗实例的数据库,因为它们出现在各种赞美诗。 该表设置大致是这样的:如何GROUP BY“相同”的不同长度的字符串?

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不存在于数据库,我只是把他们表现出相同和不同):

哦,多么可爱是早上[A]

哦,多么可爱[A]

啊,真漂亮是早上!辐射光束[A]

早上好可爱啊! [B]

是否有可能只返回唯一的第一线中最长的版本,这样?:

哦,多么可爱是早晨!辐射光束[A]

早上好可爱啊! [B]

这里的查询我到目前为止:

SELECT HyFirstLine 
FROM Hymns 
WHERE TextID = 26 AND HyFirstLine IS NOT NULL 
GROUP BY HyFirstLine 

编辑:将数据返回给Python作为词典列表。根据评论,也许最好用Python来过滤事实?我不知道我会如何去做这件事。添加Python标签。

+1

需要程序循环就如PHP – SIDU

+0

我怀疑的是,你要么需要一个用户定义的函数来处理这,或者可能需要使用像Java这样的语言。 –

+0

您是否尝试过使用'Cursor'或'TempTable'迭代数据集? – Eduard

回答

0

编辑:这是用于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 
相关问题