PHP / MYSQL: получить последнюю запись таблицы в счетчике строк Join AND объединенной таблицы - PullRequest
2 голосов
/ 28 октября 2011

Хорошо, у меня есть две таблицы, таблица категорий и таблица сообщений.

Я надеялся создать запрос, который будет возвращать каждую категорию, последнюю запись в таблице сообщений для этой категории (category.id = post.category_id) И количество строк всех сообщений с post.category_id = category.id)

т. е.

Список категорий, каждая из которых содержит запись последнего сообщения для этой категории и количество сообщений в этой категории.

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

Мне также удалось получить список категорий и ихПОСЛЕДНЕЕ сообщение, но не количество сообщений.

Любая помощь / направления будут высоко оценены!

Ответы [ 2 ]

1 голос
/ 28 октября 2011

В ваших описаниях не хватает данных (я сделал предположения), но SQL должен быть:

SELECT category_id,max(postdate) last,count(id) postcount
FROM posts
GROUP BY category_id

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

Предположения:

  1. В вашей таблице сообщений есть столбец с именем postdate, который отражает дату создания сообщения (поэтому максимальный - самый последний). Вы также можете сделать max(id), если нет дат ... хотя, только если нет изменений, предыдущее сообщение может быть обновлено, так что оно фактически более свежее (например, id = 2 создано на прошлой неделе, обновлено сегодня, id = 3 создано вчера ).
  2. Есть столбец с именем id - уникальный идентификатор для каждой строки сообщения.

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

1 голос
/ 28 октября 2011

Попробуйте это:

SELECT category_id, MAX(post_id) AS post_id, COUNT(*) AS posts
FROM post
GROUP BY category_id

Предполагается, что у вас есть столбец post_id, который строго увеличивается и уникален.

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

Для получения категорий без сообщений используйте левое соединение:

SELECT
    category.id AS category_id,
    MAX(post.id) AS post_id,
    COUNT(post.category_id) AS posts
FROM category
LEFT JOIN post
ON category.id = post.category_id
GROUP BY category.id

Если вам нужно больше столбцов из каждой таблицы, вы можете объединить приведенный выше результат с исходными таблицами:

SELECT *
FROM
(
    SELECT
        category.id AS category_id,
        MAX(post.id) AS post_id,
        COUNT(post.category_id) AS posts
    FROM category
    LEFT JOIN post
    ON category.id = post.category_id
    GROUP BY category.id
) T1
JOIN category
ON T1.category_id = category.id
LEFT JOIN post
ON T1.post_id = post.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...