2016-07-23 5 views
3

2 개의 테이블을 가진 mysql 데이터베이스가 있습니다 : songideen, kommentare. "songideen"에서는 "kommentare"에 노래를 저장할 수 있습니다. 두 테이블 모두 LEFT JOIN을 통해 링크됩니다. 행에 행을 병합하는 방법 (노래에 2 개 이상의 의견이있는 경우) 모든 주석은 한 행에서 ','로 구분됩니까?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, 테이블 디자인을 수정하거나 적어도 일부 컬럼 이름을 변경해야합니다.

kommentare. KommentarID - 이것은 kommentare의 실제 식별자가 아니지만 해당 songideen의 ID입니다. id이므로이 부분을 songideenID이라고하면 쉽게 볼 수 있습니다. 이는 테이블 간의 관계를 만드는 열입니다.

누락 된 "실제"코드 - kommentare 테이블에있는 primary key은 무엇입니까? auto_incrementintprimary key은 매우 직관적입니다.

그런 다음이 loke 보일 것이다 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 '에 하나의 열을 추가하고 두 테이블 모두에서 songideenID의 이름을 변경하면 필요에 따라 하나씩 단계를 수행 할 수 있습니다. "작동하지 않는"것은 무엇을 의미합니까? 잘못된 결과? – 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 테이블에 대한 레코드는 값이 kommentare.kommentarID이됩니다. 따라서 최종 결과 세트는 kommentare 테이블에 해당 설명이있는 레코드와 kommentare 테이블에있는 NULL 항목의 항목이 모두 포함됩니다.

관련 문제