нужен запрос mysql, чтобы решить, "сгруппировать по" и "упорядочить по", не возвращая последнее сообщение - PullRequest
2 голосов
/ 25 ноября 2011
CREATE TABLE `messages` (
  `message_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `message_project_id` int(7) unsigned NOT NULL DEFAULT '0',
  `message_time` int(11) unsigned NOT NULL DEFAULT '0',
  `message_from_user_id` int(7) unsigned NOT NULL DEFAULT '0',
  `message_to_user_id` int(7) unsigned NOT NULL DEFAULT '0',
  `message_details` text COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`message_id`)
)


CREATE TABLE `project` (
  `project_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `project_user_id` int(7) unsigned NOT NULL DEFAULT '0',
  `project_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `project_status` varchar(50) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
 PRIMARY KEY (`project_id`)
) 

Что я хочу получить, так это последние сообщения пользователю № 2 для каждого проекта.

Пользователь # 2 является владельцем проекта, поэтому может получать сообщения от многих заинтересованных сторон.

На текущей странице будет отображен список вещей "To Do" для пользователя # 2.Я хочу найти любые сообщения для текущих открытых проектов, в которых пользователь № 2 получил сообщение, но еще не отправил одно

, поэтому, если пользователь № 1 отправил сообщение пользователю № 2, в строке была бы строка.таблица сообщений

message_id | project_id | message_time | message_from_user_id | message_to_user_id | message_details
30 | 12 | 1304707966 | 1 | 2 | Hello user number two, thank you for your interest in my project
31 | 12 | 1304707970 | 2 | 1 | Hello user number one, Your project looks interesting
32 | 12 | 1304707975 | 3 | 1 | Hello user number one, here is my first message, im user number three.  I want to do your project
32 | 13 | 1304707975 | 7 | 1 | Hello user number one, here is my first message, im user number seven.  I want to do your other project

То, что я пробовал до сих пор, но не вполне работает: // это даст мне самое последнее сообщение для каждого проекта, но не отдельно для пользователя

SELECT cur.*, p.*
FROM messages cur
LEFT JOIN messages next ON cur.message_project_id = next.message_project_id AND cur.message_time < next.message_time
LEFT JOIN project p ON p.project_id = cur.message_project_id
WHERE next.message_time IS NULL
AND (cur.message_from_user_id = 2 OR cur.message_to_user_id = 2)
AND (p.project_status LIKE 'open' OR p.project_status LIKE 'started')
AND p.project_user_id = 2
ORDER BY cur.message_time DESC 

// Это разделит пользователя, но не вернет текст самого последнего сообщения

SELECT *
FROM messages m
LEFT JOIN project p ON p.project_id = m.message_project_id
WHERE (message_from_user_id = 2 OR message_to_user_id = 2 )
AND (p.project_status LIKE 'open' OR p.project_status LIKE 'started')
AND p.project_user_id = 2
GROUP BY project_id
ORDER BY message_time DESC 

Как только данные вернутся в Php, я проверяю, является ли последнее сообщение TO пользователем # 2 и является ли онозатем отправьте сообщение «Вам нужно ответить» на его экран.

Ответы [ 2 ]

1 голос
/ 25 ноября 2011

Вероятно, это помогло бы, если бы вы дали пример выходных данных, который охватывает большинство ваших случаев.Судя по вашим комментариям и после перечитывания пару раз, я думаю это то, что вы ищете:

SELECT
    <column list>
FROM
    Messages M
INNER JOIN Projects P ON
    P.project_id = M.message_project_id AND
    P.project_status IN ('open', 'started') AND
    P.project_user_id = 2
WHERE
    M.message_to_user_id = 2 AND
    NOT EXISTS (
        SELECT *
        FROM Messages M2
        WHERE
            M2.message_from_user_id = 2 AND
            M2.message_project_id = M.message_project_id AND
            M2.message_to_user_id = M.message_from_user_id AND
            M2.message_time >= M.message_time
    )

Это даст вам все сообщения для всех проектовдля пользователя, которому он не отправил сообщение отправителю этого проекта.Вы можете добавить ORDER BY, конечно.

0 голосов
/ 25 ноября 2011

Работает ли это:


SELECT *
FROM messages m
LEFT JOIN project p ON (p.project_id = m.message_project_id)
WHERE (m.message_from_user_id = 211 OR m.message_to_user_id = 211 )
AND p.project_status IN('open','started') AND p.project_user_id = 2
GROUP BY p.project_id
ORDER BY m.message_time DESC 

Надеюсь, это поможет

...