SQL Отделяет ключи таблицы от Group_Concat

#php #mysql #sql #database #join

#php #mysql #sql #База данных #Присоединиться

Вопрос:

Я пытаюсь разделить столбец IDPosts в виде одной строки для каждого идентификатора (пытаясь создать список избранных записей). В столбце рядом с ним перечислены все соответствующие столбцы, но они сгруппированы, я хочу получить строку для каждого из них, сгруппированных вместе в столбце favuserposts. Смотрите мою картинку и запрос ниже. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

введите описание изображения здесь

Отображает все, но не может отобразить несколько идентификаторов избранных записей:

 SELECT Users.IDUser, 
       Users.username, 
       Users.profile_picture, 
       Favorites.IDPosts,
       GROUP_CONCAT(DISTINCT coalesce(Favorites.IDPosts,'')) as "favuserposts", 
       ( Select body 
         from Posts 
         where Favorites.IDPosts=Posts.IDPosts 
          AND Users.IDUser=Favorites.IDUser)    
FROM Users
    LEFT OUTER JOIN Favorites ON Favorites.IDUser = Users.IDUser
GROUP BY Users.IDUser HAVING COUNT(IDPosts)>0;
  

Комментарии:

1. Я бы не стал хранить несколько идентификаторов в одном поле. вы можете создать таблицу, в которой хранятся iduser и idpost.

2. Я пытаюсь избежать именно этого. У меня есть таблица избранного, которая выполняет то, что вы только что описали, только с идентификатором записи и идентификатором пользователя.

Ответ №1:

Вы группируетесь по идентификатору пользователя. Таким образом, все остальные выбранные вами поля в некотором роде являются агрегированными. Либо вы указываете желаемый агрегат (MIN, MAX, GROUP_CONCAT и т.д.), Либо получаете случайное совпадение. Итак, давайте посмотрим, что вы выбираете:

  • Users.username = «случайное» имя пользователя для идентификатора пользователя, но поскольку для каждого идентификатора пользователя используется только одно имя, вы, конечно, получаете одно имя пользователя для идентификатора
  • Users.profile_picture = то же, что имя пользователя; вы получаете одно изображение для пользователя
  • Favorites.IDPosts = случайный идентификатор записи пользователя
  • GROUP_CONCAT(DISTINCT coalesce(Favorites.IDPosts,'')) = строка всех различных идентификаторов
  • ( Select body from Posts ...) = случайное одно из сообщений пользователя

Итак, если вам нужна строка со списком всех тел, тогда используйте group_concat, точно так же, как вы делаете с идентификаторами post:

 GROUP_CONCAT(DISTINCT
( Select body 
  from Posts 
  where Favorites.IDPosts=Posts.IDPosts 
  AND Users.IDUser=Favorites.IDUser
)) as bodies 
  

Комментарии:

1. Закрыть, но я не хочу ничего группировать. Я хочу отдельную строку для каждого поста.

2. @user2793987: Ну, если вы не хотите группировать по чему-либо, тогда просто объедините все таблицы и покажите столбцы.

3. Разобрался с этим, добавив еще один внешний ключ.