В PHP + MySQL, Как объединить много таблиц с условиями - PullRequest
0 голосов
/ 29 апреля 2010

Я пытаюсь обеспечить полную активность пользователей по всему сайту.

Мне нужно объединить несколько таблиц в базе данных, при условии, что это один пользователь.

То, что я сейчас написал, это:

SELECT * FROM 
comments AS c 
JOIN rphotos AS r 
ON c.userID = r.userID
AND c.userID = '$defineUserID';

Но то, что он возвращает, это все о пользователе, но он повторяет строки.

Например, на одного пользователя у него 6 фотографий и 5 комментариев. Поэтому я ожидаю, что объединение вернет 11 строк.

Вместо этого он возвращает 30 результатов примерно так:

PhotoID = 1;
CommentID = 1;
PhotoID = 1;
CommentID = 2;
PhotoID = 1;
CommentID = 3;

и так далее ...

Что я делаю не так?

Чего я пытаюсь достичь (пример)

Если вы пользователь Facebook, у каждого профиля есть «стена», которая отображает активность пользователя на сайте в хронологическом порядке. Я пытаюсь сделать что-то подобное.

Ответы [ 3 ]

1 голос
/ 29 апреля 2010

Что я делаю не так?

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

1 голос
/ 29 апреля 2010

То, что вы получите 30 результатов, если у определенного пользователя есть 6 фотографий и 5 комментариев, вполне нормально, поскольку вы просто выбираете декартово произведение всех фотографий и комментариев на основе идентификатора пользователя. Структура таблицы может пролить некоторый свет на возможные решения, но если комментарии связаны с фотографиями и вы хотите получить все фотографии и комментарии, опубликованные конкретным пользователем, вы можете использовать что-то вроде:

SELECT * FROM rphotos p
LEFT JOIN comments c on c.photoID = p.photoID
WHERE p.userID = '$defineUserID' OR c.userID = '$defineUserID';

Лично я бы разделил это на 2 запроса и отобразил бы результаты отдельно, потому что смешивать их не имеет никакого смысла для меня, т.е. использовать

SELECT * FROM rphotos p
WHERE p.userID = '$defineUserID';

и

SELECT * FROM comments c
WHERE c.userID = '$defineUserID';

редактировать на основе комментария

Если поля идентификаторов имеют одинаковый тип, вы можете использовать что-то вроде

select actionID, relatedID, creationDate from
(
select 1 as actionID, photoID as relatedID, creationDate from rphotos
where userID = '$defineUserID'
union
select 2 as actionID, commentID as relatedID, creationDate from comments
where userID = '$defineUserID'
) actions
order by creationDate desc;

actionID будет 1 для фотографии, 2 для комментария, и с помощью поля relatedID вы можете найти связанные данные (если вам это нужно, в противном случае вы можете просто удалить их из запроса).

Кстати, вы, вероятно, хотите дополнительно отфильтровать результаты (т. Е. На основе даты), чтобы предотвратить объединение множества строк в объединение, которые вы не будете отображать ...

1 голос
/ 29 апреля 2010

Вы должны сделать это следующим образом:

SELECT * FROM  user AS u
LEFT JOIN rphotos AS r ON u.userId = r.userID
LEFT JOIN comments AS c ON u.userId = c.userID
WHERE u.userId = '$defineUserID'

Обновлено для исправления глупых ошибок

Для этого нужно выбрать всех соответствующих пользователей из пользовательской таблицы (в данном случае 1), а затем, при необходимости, присоединиться к другим таблицам и не повторять строки.

Запрос также имеет больше смысла, когда вы думаете об этом логически.

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