[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Система сообщений
blade
В общем делаю систему сообщений для сайта.

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

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

Уже голову сломал как зделать, помогите пожалуйста!

Вот код:


// Список всех сообщений
$sql_Mail_List = mysql_query("SELECT * FROM mail WHERE client = '" .$visitor_name. "' GROUP BY starter ORDER BY status DESC, date DESC");

echo "<table border=\"0\" width=\"80%\" align=\"center\">";
echo "<tr>";
echo "<td class=\"td_title\">Список сообщений пользователя</td>";
echo "</tr>";

while ($Mail_List = mysql_fetch_assoc($sql_Mail_List))
{
echo "<tr>";
echo "<td>";
echo "<br />" . $Mail_List["id"];
echo "</td>";
echo "</tr>";
}

echo "</table>";



CREATE TABLE IF NOT EXISTS `mail` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`starter` varchar(40) NOT NULL,
`client` varchar(40) NOT NULL,
`text` text NOT NULL,
`del_starter` int(1) NOT NULL,
`del_client` int(1) NOT NULL,
`date` datetime NOT NULL,
`user_id` int(11) NOT NULL,
`status` int(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
)
ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=19 ;




Спустя 1 час, 49 минут, 3 секунды (8.06.2012 - 14:33) GET написал(а):
Цитата
WHERE client = '" .$visitor_name. "'


вот же конкретное условие, как он может не показывать, только если GROUP BY starter не мешает, попробуй убрать из запроса?

Спустя 1 минута (8.06.2012 - 14:34) blade написал(а):
Показывает все сообщения а мне нужно только последнее!

Спустя 3 минуты, 19 секунд (8.06.2012 - 14:37) GET написал(а):
blade

SELECT DISTINCT * FROM mail WHERE client = '" .$visitor_name. "' GROUP BY starter ORDER BY status DESC, date DESC"

Спустя 5 минут, 19 секунд (8.06.2012 - 14:43) blade написал(а):
Вот скрин! Как построенна БД! Нужно чтоб выбрало 3 записи которые отмечены, связаны они передаваемым параметром $visitor_name

user posted image

Спустя 8 минут (8.06.2012 - 14:51) GET написал(а):
WHERE client = '" .$visitor_name. "'

client:
fanatik vs administrator,

может я не понимаю чего то, но как они могут быть связаны?

WHERE client = 'administrator' почему он должен вывести строку с fanatik?

Спустя 4 часа, 33 минуты, 5 секунд (8.06.2012 - 19:24) blade написал(а):
В том то и вопрос как правильно запрос составить

Спустя 2 минуты, 50 секунд (8.06.2012 - 19:26) blade написал(а):
ник может быть в поле client и в starter

Спустя 20 секунд (8.06.2012 - 19:27) neadekvat написал(а):
Цитата (blade @ 8.06.2012 - 20:24)
В том то и вопрос как правильно запрос составить

Чтобы правильно составить запрос, нужно правильно сформулировать задачу.
В данном треде этого не наблюдается. Сформулируй.

Спустя 24 минуты, 22 секунды (8.06.2012 - 19:51) blade написал(а):
Каков должен быть запрос к БД mysql чтобы выбрать записи которые показаны на рисунке и избежать дублирующих записей!

Вроде правильно сформулировал!

Спустя 5 минут, 28 секунд (8.06.2012 - 19:57) neadekvat написал(а):
Цитата (blade @ 8.06.2012 - 20:51)
Вроде правильно сформулировал!

Нет.

Что есть дублирующие записи? Почему именно те записи, которые выделены на рисунке?

Спустя 5 минут, 57 секунд (8.06.2012 - 20:03) blade написал(а):
Чтобы не выводило все записи где client = 'administrator' или starter = 'administrator' а вывело только одну и последнюю по дате!

Спустя 2 минуты, 49 секунд (8.06.2012 - 20:05) neadekvat написал(а):
Цитата (blade @ 8.06.2012 - 21:03)
Чтобы не выводило все записи где client = 'administrator' или starter = 'administrator'

Тогда объясни мне, почему в запросе из первого поста этой темы у тебя прописано только одно поле - client?

Спустя 13 минут, 40 секунд (8.06.2012 - 20:19) blade написал(а):
ну если написать WHERE client = 'administrator' AND starter = 'administrator' то вообще ничего не выведит

Спустя 9 минут, 3 секунды (8.06.2012 - 20:28) neadekvat написал(а):
Но тебе не пришло в голову, что нас это запутает?

Чисто логически - зачем писать И, когда нужен ИЛИ?
AND -> OR

А теперь попробуй описать словами запрос из базы данных. Без sql, как ты представляешь эту выборку, или как бы ты ее делал вручную?

Спустя 2 минуты, 39 секунд (8.06.2012 - 20:31) blade написал(а):
Выбрать все записи из бд где starter или client равно администратор сгрупировать все по полю user_id отсортировать по дате DESC, статус DESC

Так ?

Спустя 11 минут, 36 секунд (8.06.2012 - 20:42) neadekvat написал(а):
Не могу сказать.
Во-первых, я не знаю, для чего служит поле user_id.
Во-вторых, порой проще провести тест, чем гадать на кофейной гуще.

Спустя 5 минут, 2 секунды (8.06.2012 - 20:47) blade написал(а):
user_id это id пользователя которому пишем

Спустя 8 минут, 32 секунды (8.06.2012 - 20:56) neadekvat написал(а):
Тогда зачем мы будем группировать по этому полю?

Спустя 33 минуты, 37 секунд (8.06.2012 - 21:30) blade написал(а):
А по какому группировать ?

Спустя 44 минуты, 6 секунд (8.06.2012 - 22:14) neadekvat написал(а):
Моя цель - заставить тебя подумать. Думай. Зачем нам группировка здесь, по какому полю, и есть ли в этом смысл.

Спустя 4 часа, 59 минут, 9 секунд (9.06.2012 - 03:13) blade написал(а):
Вот я пришел к такому запросу


mysql_query("SELECT DISTINCT * FROM mail WHERE client = '" .$visitor_name. "' OR starter = '" .$visitor_name. "' GROUP BY starter ORDER BY date DESC, status DESC");


Выводит только первые попавшиеся совпадения, остальные отсеивает хоть там и дата больше чем в первом попавшемся

Спустя 11 часов, 47 минут, 11 секунд (9.06.2012 - 15:00) neadekvat написал(а):
Хм, DISTINCT и GROUP BY в одном запросе..

Не получается вернуть нужную дату, потому что GROUP BY срабатывает раньше, сортировка же работает для сформированных строк.
Тут, похоже, без вложенного запроса не обойтись.

Спустя 1 час, 4 минуты, 19 секунд (9.06.2012 - 16:04) blade написал(а):
Можно пример такого запроса, я попробую по аналогии сделать свой ?

Спустя 7 минут, 38 секунд (9.06.2012 - 16:12) neadekvat написал(а):
SELECT * FROM
( SELECT * FROM tbl ORDER BY )
GROUP BY


Примерно так. Тут тестить надо, тестить, у меня с первого раза только банальные запросы работают.

Спустя 54 минуты, 10 секунд (9.06.2012 - 17:06) blade написал(а):
SELECT * FROM ( SELECT * FROM mail WHERE starter = 'administrator' OR client = 'administrator' ORDER BY date DESC ) GROUP BY user_id


Вообще ничего не возвращает

Спустя 10 минут, 12 секунд (9.06.2012 - 17:16) neadekvat написал(а):
Ну отлично. Открой документацию, посмотри, какие есть возможности у sql. Думаешь, я бы это делал как-то иначе? Попробовал - не получилось, курю доки и гугл, пробую еще раз.

Спустя 17 минут, 33 секунды (9.06.2012 - 17:34) blade написал(а):
Такой запрос можно сделать к БД или нет ?

Спустя 5 минут, 6 секунд (9.06.2012 - 17:39) neadekvat написал(а):
Конечно. Вопрос только в его сложности.

Спустя 21 минута, 34 секунды (9.06.2012 - 18:01) blade написал(а):
Пришел к такому вот запросу.

SELECT * FROM (SELECT * FROM mail WHERE starter = 'administrator' OR client = 'administrator' ORDER BY date DESC) mail GROUP BY starter, user_id


Сортировка по дате сработала. Вот что получил
user posted image

Как теперь из этого оставить только ?
user posted image

Спустя 2 часа, 50 минут (9.06.2012 - 20:51) neadekvat написал(а):
Сходу в голову приходит только копье ничего не приходит.

Но я бы посмотрел в сторону группировки и по полю стартер и по полю клиент, например. То есть как-то сделать так, чтобы значения этих полей рассматривались вместе. (DISCTINT starter, client или подобные конструкции).

Спустя 19 минут, 48 секунд (9.06.2012 - 21:10) blade написал(а):
колдовал с DISTINCT starter, client но ничего не выходит.Может просто не реально сделать так как я хочу ?

Спустя 1 час, 32 секунды (9.06.2012 - 22:11) Placido написал(а):
SELECT *
FROM
(SELECT
*,
LEAST(`starter`, `client`) AS `sort1`,
GREATEST(`starter`, `client`) AS `sort2`
FROM
`mail`
ORDER BY `date` DESC) `mail2`
GROUP BY `mail2`.`sort1`,`mail2`.`sort2`;

Спустя 14 часов, 31 минута, 7 секунд (10.06.2012 - 12:42) blade написал(а):
Спасибо за помощь
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.