2016-07-23 3 views
3

У меня есть база данных mysql с двумя таблицами: songideen, kommentare. В «songideen» вы можете хранить песни, в «kommentare» вы можете прокомментировать их. Обе таблицы связаны через LEFT JOIN. Как объединить строки (в случае, если у песни есть 2 или более комментариев), поэтому все комментарии разделены ',' в пределах одной строки? В этом примере я хочу, чтобы объединить второй и третий ряд:Объединить строки mysql с одинаковым идентификатором, используя 2 таблицы

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

объяснение:

здесь мы используем внутреннее соединение, вы не получите никаких дубликатов. и с помощью имеющих можно ограничить число комментариев

+0

Проблема заключается в том, что показаны только песни WITH comments. Но есть песни без комментариев (и, следовательно, без 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 на вложенный запрос, который возвращает сцепленный kommentare сгруппированных по KommentarID.

Но tbh, вы должны переделать свой дизайн стола или, по крайней мере, изменить некоторые имена столбцов.

kommentare. KommentarID - Это, по-видимому, не является фактическим идентификатором для kommentare, но является идентификатором соответствующего songideen. id, поэтому его следует называть songideenID, поэтому вы можете легко увидеть, что это столбец, который строит связь между таблицами.

Отсутствует «актуально» Комментирование - что такое primary key в вашем kommentare столе? 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' и переименовал songideenID в обе таблицы. Хотя что означает «не работает»? неправильный результат? – Philipp

+0

Да, мне нужно некоторое время для отладки. Но спасибо за вашу помощь! :-) Еще один крошечный вопрос: какой лучший способ добавить еще одну строку «Пользователь» в таблице «kommentare», чтобы показать, кто написал этот комментарий? Мне, вероятно, также нужна 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. Для записей в таблице songideen, у которой нет комментариев в таблице kommentare, результат будет NULL значение kommentare.kommentarID. Таким образом, ваш окончательный результат будет состоять из тех записей, которые имеют соответствующие комментарии в таблице kommentare плюс одна запись для всех записей NULL, найденных в таблице kommentare.

Смежные вопросы