2016-07-28 61 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 
相關問題