|
|
|
|
|
для: Aramor
(13.12.2009 в 12:06)
| | а автоинкрементный первичный ключ в таблице сообщений есть?
Лучше ориентироваться на него, а не на дату.
SELECT
`message`.`from_user` as `contact`,
count(*) AS `cnt_message`,
sum(`read` = '0') AS `cnt_not_read`,
max(id) AS `last_id`
FROM
`message`
WHERE
`message`.`to_user` = '180'
GROUP BY
`message`.`from_user`
|
ну и дальше подсоединить таблицу JOINом по условию равенства ключей.
SELECT ..., m.date_ins , SUBSTRING(m.`text`...)
FROM
(
SELECT ...
) AS p
JOIN messages AS m ON p.last_id = m.id
|
| |
|
|
|
|
|
|
|
для: Trianon
(13.12.2009 в 11:53)
| | Хорошо, а как можно сделать тогда? | |
|
|
|
|
|
|
|
для: Aramor
(13.12.2009 в 09:14)
| | Нельзя указывать в списке SELECT негруппирующие поля, кроме тех что в аргументах агрегатных функций.
SUBSTRING - функция обычная, неагрегатная. | |
|
|
|
|
|
|
|
для: Aramor
(12.12.2009 в 06:18)
| | Написал вот такой запрос:
SELECT `new_table`.`contact`, SUM(cnt_message) AS `cnt_message`, `new_table`.`cnt_not_read`, `new_table`.`last_message`, `new_table`.`last_message_text`
FROM (
(SELECT
`message`.`from_user` as `contact`,
count(*) AS `cnt_message`,
sum(`read` = '0') AS `cnt_not_read`,
max(date_ins) AS `last_message`,
SUBSTRING(`text`,1,20) as `last_message_text`
FROM
`message`
WHERE
`message`.`to_user` = '180'
GROUP BY
`message`.`from_user`)
UNION
(SELECT
`message`.`to_user` as `contact`,
count(*) AS `cnt_message`,
sum(`read` = '0') AS `cnt_not_read`,
max(date_ins) AS `last_message`,
SUBSTRING(`text`,1,20) as `last_message_text`
FROM
`message`
WHERE
`message`.`from_user` = '180'
GROUP BY
`message`.`to_user`)
) AS `new_table` GROUP BY `new_table`.`contact` ORDER BY `last_message` DESC;
|
Но есть маленькая загвоздка: не могу понять, как взять текст именно последнего собщения данного контакта.
SELECT
`message`.`from_user` as `contact`,
count(*) AS `cnt_message`,
sum(`read` = '0') AS `cnt_not_read`,
max(date_ins) AS `last_message`,
SUBSTRING(`text`,1,20) as `last_message_text`
FROM
`message`
WHERE
`message`.`to_user` = '180'
GROUP BY
`message`.`from_user`
|
т.е. дата берётся последнего сообщения, а текст сообщения первого попавшегося. А нужно. чтобы текст брался того сообщения, которое последнее. Подскажиет пожалуйсто. | |
|
|
|
|
|
|
|
для: Trianon
(12.12.2009 в 16:27)
| | Вот запрос для исходящих:
SELECT
`message`.`to_user`,
count(*) AS `cnt`,
max(date_ins) AS `last_message`,
sum(`read` = false) AS `cnt_not_read`
FROM
`message`
WHERE
`from_user` = '180'
GROUP BY
`message`.`to_user`
|
Результат:
to_user___________cnt_________last_message______cnt_not_read
25_____________2__________09.12.2009 23:42________0
26_____________1__________08.12.2009 23:42________1
Вот запрос для входящих:
SELECT
`message`.`from_user`,
count(*) AS `cnt`,
max(date_ins) AS `last_message`,
sum(`read` = false) AS `cnt_not_read`
FROM
`message`
WHERE
`to_user` = '180'
GROUP BY
`message`.`from_user`
|
Результат:
from_user_____cnt___last_message____cnt_not_read
21_________2___07.12.2009 23:42______2
25_________1___11.12.2009 15:33______1
30_________1___06.12.2009 23:42______1 | |
|
|
|
|
|
|
|
для: Trianon
(12.12.2009 в 16:27)
| | И таки да. Полного внешнего соединения (FULL OUTER JOIN) в MySQL нету. А посему вариант с двумя независимыми запросами (и формированием FULL OUTER JOIN средствами php) оказывается предпочтительным. | |
|
|
|
|
|
|
|
для: Aramor
(12.12.2009 в 15:55)
| | Насчет результат такой же - враки.
Спешите... Сказал же - сперва один запрос! Потом только - другой.
Вот это у Вас запрос для исходящих. Так?
SELECT
`message`.`from_user`,
`message`.`to_user`,
count(*) AS `cnt`,
max(date_ins) AS `last_message`,
sum(case `read` when true then 0 else 1 end) AS `cnt_not_read`
FROM
`message`
WHERE
`from_user` = '180'
GROUP BY
`message`.`to_user`
|
Если убрать `message`.`from_user` из SELECT то будет вполне себе симпатично. Ну еще агрегат в sum() можно попроще написать. sum(`read` = false) | |
|
|
|
|
|
|
|
для: Trianon
(12.12.2009 в 12:28)
| | Написал вот аткой запрос, но результат такой же. как и у предыдущего
(SELECT
`message`.`from_user`,
`message`.`to_user`,
count(*) AS `cnt`,
max(date_ins) AS `last_message`,
sum(case `read` when true then 0 else 1 end) AS `cnt_not_read`
FROM
`message`
WHERE
`from_user` = '180'
GROUP BY
`message`.`to_user`)
UNION ALL
(SELECT
`message`.`from_user`,
`message`.`to_user`,
count(*) AS `cnt`,
max(date_ins) AS `last_message`,
sum(case `read` when true then 0 else 1 end) AS `cnt_not_read`
FROM
`message`
WHERE
`to_user` = '180'
GROUP BY
`message`.`from_user`)
|
не понимаю как логически это релизовать | |
|
|
|
|
|
|
|
для: Aramor
(12.12.2009 в 12:25)
| | Постойте, но Вы же написали общий запрос.
Напишите его же, но только для входящих сообщений.
Ошибки будут - исправим. | |
|
|
|
|
|
|
|
для: Trianon
(12.12.2009 в 11:40)
| | Что для вас очевидно - для меня тайна, покрытая мраком. Не могли бы помочь запросиком? | |
|
|
|
|