2016-07-28 2 views
0

У меня есть база данных экземпляров гимнов, как они появляются в разных сборниках гимнов. Стол устанавливается примерно так:Как я могу группировать «одинаковые» строки разной длины?

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]

O, как прекрасное было утро! [B]

Можно ли вернуть только самую длинную версию уникальных первых линий, как это ?:

Ах, как мило было утро! Лучистый луч [A]

O, как прекрасное было утро! [B]

Вот запрос, я до сих пор:

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

EDIT: Данные возвращаются в Python как список словарей. На основании комментариев, может быть, лучше фильтровать после факта с Python? Я не знаю, как это сделать. Добавление тега Python.

+1

требуется цикл это, например, PHP – SIDU

+0

Мое подозрение в том, что вам нужно будет либо определенную пользователем функцию, чтобы справиться с этим , или, возможно, нужно использовать такой язык, как Java. –

+0

Вы пытались перебирать через набор данных с помощью 'Cursor' или' TempTable'? – Eduard

ответ

0

EDIT: Это для 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 
Смежные вопросы