#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. Разобрался с этим, добавив еще один внешний ключ.