2016-07-23 11 views
3

私は2つのテーブルを持つmysqlデータベースを持っています:songideen、kommentare。 "songideen"では曲を保存でき、 "kommentare"にはコメントできます。どちらのテーブルもLEFT JOINでリンクされています。 行をマージするには(ソングに2つ以上のコメントがある場合)、すべてのコメントは1行で '、'で区切られますか?この例では、私は第二と第三の行を結合したい:2つのテーブルを使用して同じIDのmysql行をマージする

Name Arbeitstitel Datum  mp3 ID Kommentare KommentarID 
Lukas Titeltest 2016-06-06 Link  1 comment  1 
Jannik Titeltest2 2016-07-06 Link2 2 comment2  2 
Jannik Titeltest2 2016-07-06 Link2 2 comment3  2 
Andi Titeltest3 2016-07-20 Link3 3 comment4  3 

私はalradyこの方法は、それを試してみましたが、それは動作しません:

$sql = "SELECT songideen.Name, songideen.Arbeitstitel, songideen.Datum, songideen.mp3, songideen.ID, GROUP_CONCAT(kommentare.Kommentar SEPARATOR ',') AS KommentarIDs, kommentare.KommentarID 
       FROM songideen 
       LEFT JOIN kommentare 
       ON songideen.ID=kommentare.KommentarID 
       GROUP BY kommentare.KommentarID"; 
+0

質問に画像として表示されているものを投稿してください – e4c5

+0

完了、これが大丈夫ですか? – Exxeca

+0

テーブルの構造を表示できますか? – Philipp

答えて

0

使用あなたの出力のためのクエリを以下に示します。

$sql = "SELECT s.Name, s.Arbeitstitel, s.Datum, s.mp3, s.ID, GROUP_CONCAT(k.Kommentar SEPARATOR ',') AS KommentarIDs, k.KommentarID,(SELECT count(*) FROM kommentare where KommentarID= s.ID) as commentCount 
       FROM songideen s , kommentare k 
       where s.ID=k.KommentarID    
       GROUP BY k.KommentarID 
        having commentCount>2 
       "; 

説明:

ここで我々は、内側を使用しているあなたが任意の重複を得ることはありません参加。そしてあなたが数を制限することができた使用すると、KommentarIDによってグループ化された連結kommentareを返すサブクエリに

+0

ここでの問題は、コメント付きの曲のみが表示されることです。しかし、コメントのない曲が存在する(したがって、KommentarIDはない)。 – Exxeca

0
SELECT 
    * 
FROM songideen 
LEFT JOIN (SELECT 
    GROUP_CONCAT (kommentare SEPARATOR ','), KommentarID 
FROM kommentare 
GROUP BY KommentarID) AS kommentare 
    ON kommentare.KommentarID = songideen.id 

LEFT JOINをコメントしています。

しかし、tbhでは、テーブルデザインを修正するか、少なくとも列の名前を変更する必要があります。

kommentareKommentarID - これはkommentareの実際の識別子ではありませんが、対応するsongideenのIDです。 idなので、これはsongideenIDと呼ばれるので、簡単に見ることができます。これは、テーブル間の関係を構築する列です。

あなたのkommentareテーブルにはprimary keyとは何ですか? auto_incrementintprimary keyは非常に直感的です。

それは、このロークになります。http://sqlfiddle.com/#!9/150e7/4

SELECT 
    * 
FROM songideen 
LEFT JOIN (SELECT 
    GROUP_CONCAT(Kommentare SEPARATOR ',') AS kommentar, songideenID 
FROM kommentare 
GROUP BY songideenID) AS kommentare USING(songideenID) 
+0

私はほぼphpmyadminにスキーマをコピーし、SQLは私のPHPファイルにコピーしても、まだ動作しません:/ – Exxeca

+0

? :pよく構造を変更したい場合は、デバッグに時間をかけてください。 'kommentare'に1つのカラムを追加し、両方のテーブルでsongideenIDの名前を変更するだけで、必要に応じてステップを1つずつ実行できます。 「うまくいかない」とはどういう意味ですか?間違った結果? – Philipp

+0

ええ、私はちょうどデバッグのための時間が必要です。しかし、助けてくれてありがとう! :-)別の小さな質問:誰がこのコメントを書いたかを示すために "kommentare"テーブルに別の行 "User"を追加する最良の方法は何ですか?私はおそらくこれのためにGROUP_CONCATも必要でしょうか? – Exxeca

1

あなたはsongideen.IDによってグループに必要。 songideenのテーブルには、kommentareテーブルにコメントがないので、テーブルがあります。

SELECT 
    songideen.Name, 
    songideen.Arbeitstitel, 
    songideen.Datum, 
    songideen.mp3, 
    songideen.ID, 
    GROUP_CONCAT(kommentare.Kommentar SEPARATOR ',') AS KommentarIDs, 
    kommentare.KommentarID 
FROM songideen 
LEFT JOIN kommentare ON songideen.ID = kommentare.KommentarID 
GROUP BY songideen.ID ; 

注:kommentare.kommentarIDによって設定された結果をグループ化して、あなたの場合は

。テーブルkommentareにコメントがないsongideenテーブルのレコードの場合、NULLの値はkommentare.kommentarIDになります。したがって、最終結果セットは、kommentareテーブルに対応するコメントと、kommentareテーブルにあるすべてのNULLエントリの1つのエントリで構成されたレコードで構成されます。

関連する問題