2016-07-28 6 views
0

Ich habe eine Datenbank von Hymnen Instanzen, wie sie in verschiedenen Gesangbüchern erscheinen. Die Tabelle ist ungefähr so ​​aufgebaut:Wie kann ich "identische" Strings unterschiedlicher Länge gruppieren?

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); 

Manchmal sind die ersten Zeilen gleich sind, aber an einer anderen Stelle abschneidet - und manchmal sind sie verschieden (die Buchstaben A und B sind nicht in der Datenbank , ich habe sie nur in gleichen und verschieden zu zeigen):

Oh, wie schön war der Morgen [A]

Oh, wie schön [A]

Oh, wie schön war die Morgen! Strahlender Strahl [A]

O wie schön war der Morgen! [B]

Ist es möglich, nur die längste Version der einzigartigen ersten Zeilen zurück, wie dies ?:

Oh, wie schön der Morgen war! Strahlender Strahl [A]

O wie schön war der Morgen! [B]

Hier ist die Abfrage, die ich bisher habe:

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

EDIT: Die Daten werden als Liste der Wörterbücher zu Python zurückgegeben wird. Aufgrund der Kommentare ist es vielleicht besser, mit Python nachzufolgen? Ich bin mir nicht sicher, wie ich das machen würde. Hinzufügen des Python-Tags

+1

Notwendigkeit Programm Schleife es zB PHP – SIDU

+0

Mein Verdacht ist, dass Sie benötigen entweder eine benutzerdefinierte Funktion zu handhaben oder möglicherweise eine Sprache wie Java verwenden müssen. –

+0

Haben Sie versucht, den Datensatz mit 'Cursor' oder' TempTable' zu ​​durchlaufen? – Eduard

Antwort

0

EDIT: Dies ist für MSSQL, nicht mySQL. Entschuldigen Sie. Ich hoffe, die folgende Referenz könnte Ihnen helfen.

Nicht getestet, aber sie würden wahrscheinlich eine gespeicherte Prozedur mit so etwas wie dies benötigen:

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 
Verwandte Themen