Как эффективно выбрать уникальные данные строки / записи из 2 таблиц mysql и вернуть один объединенный результат, упорядоченный по метке времени? - PullRequest
0 голосов
/ 28 марта 2012

Stack:

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

Вместо этого я хочу сделатьпоследние 20 «действий» (комментарии или публикация) перечислены в порядке отметки времени (поэтому комментарии и материалы будут объединены в списке вместо двух отдельных списков).Вы знаете, как «канал».

Проблема в том, что комментарии извлекаются из таблицы комментариев, а представления извлекаются из таблицы «представления».

Я решилэто довольно неэффективно с помощью запроса объединения, чтобы выбрать «comment_id / submission_id», «поле идентифицирует запись как комментарий или представление», «отметка времени» из обеих таблиц.

Это дает мне результатон сообщает моему идентификатору сущности, а также определяет сущность как комментарий или публикацию, с помощью которой я могу затем выполнить другой запрос через некоторое время mysql_fetch_array, чтобы получить полный комментарий или данные для отправки.

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

Есть лилучший способ сделать это, о котором я не знаю?

Дополнительные примечания:


Пример sql Я в настоящее время использую для создания первоначального результата, о котором я говорил выше:

select comment_id, datatype, timestamp from comments where userid=3
union all
select content_id, datatype, timestamp from submissions where userid=3
ORDER BY timestamp DESC

Возвращает результат, подобный следующему:

commentid  datatype      timestamp 
5201       post          2012-03-27 20:30:40
43761      comment       2012-03-26 21:00:19
43759      comment       2012-03-26 20:59:47
5033       post          2012-03-26 20:57:36
43755      comment       2012-03-26 20:54:57
43745      comment       2012-03-26 16:32:24

Псевдокод, который я могу затем использовать для вывода информации на страницу профиля:

while ($ content_array = mysql_fetch_array ($ вышеуказанный запрос)) {

Индивидуальный запрос на выборку, извлекающий полную строку из таблицы комментариев или таблицы представления по идентификатору в зависимости от $ content_array ['datatype'];

выводит соответствующие данные из отдельныхвыберите запрос на экране профиля довольно красиво;

}

Конечно, это можно сделать лучше?

1 Ответ

1 голос
/ 28 марта 2012

Если вы не можете привести столбцы двух полных запросов таким образом, чтобы все они могли быть возвращены в UNION, вы можете присоединить результат объединения к таблицам комментариев и представлений.

SELECT records.datatype, comments.*, submissions.*
FROM (
    (
        SELECT comment_id, datatype
        FROM comments
        WHERE userid=3
        ORDER BY timestamp DESC
        LIMIT 20
    ) UNION ALL (
        SELECT content_id, datatype
        FROM submissions
        WHERE userid=3
        ORDER BY timestamp DESC
        LIMIT 20
    )
    ORDER BY timestamp DESC
    LIMIT 20
) AS records
LEFT JOIN comments
    ON records.comment_id = comments.comment_id
    AND records.datatype = 'comment'
LEFT JOIN submissions
    ON records.comment_id = submissions.content_id
    AND records.datatype = 'post'

В качестве альтернативы, вы можете запустить два самых внутренних выбора со всеми необходимыми полями и затем упорядочить окончательный результат в PHP.

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