2016-07-28 5 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]

おはようございました!

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

EDIT:[B]

は、ここで私がこれまで持っているクエリのデータは、辞書のリストとしてPythonに返されています。コメントに基づいて、おそらくそれはPythonで事実の後ろをフィルタリングする方が良いでしょうか?私はそれをどうやってやるのかは分かりません。 Pythonタグを追加する。

+1

必要プログラム、それは私の疑惑は、あなたがこれを処理するために、ユーザー定義関数を必要とするかということです – SIDU

+0

例えばPHPは:テストされていない

しかし、あなたはおそらくこのようなものでストアドプロシージャを必要とするだろう場合によってはJavaのような言語を使用する必要があります。 –

+0

'Cursor'や' TempTable'を使ってデータセットを反復しようとしましたか? – Eduard

答えて

0

EDIT:これは、mySQLではなくMSSQL用です。謝罪いたします。下の参照があなたを助けてくれることを願っています。ループへ

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 
関連する問題