Возникла проблема когда нужно вывести список всех сообщений пользователя, которые писал он или писали ему!
Все сообщения хранятся в одной таблице!
Нужно избежать дубликатов записей и отсортировать все по дате.
Все работает но оно вытягивает из базы первый попавшиеся записи и сортирует только их! Но в базе есть еще идентичные записи только дата другая, больше той которая в первом случая!
Уже голову сломал как зделать, помогите пожалуйста!
Вот код:
// Список всех сообщений
$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"
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

Спустя 8 минут (8.06.2012 - 14:51) GET написал(а):
WHERE client = '" .$visitor_name. "'
client:
fanatik vs administrator,
может я не понимаю чего то, но как они могут быть связаны?
WHERE client = 'administrator' почему он должен вывести строку с fanatik?
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, как ты представляешь эту выборку, или как бы ты ее делал вручную?
Чисто логически - зачем писать И, когда нужен ИЛИ?
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.
Во-вторых, порой проще провести тест, чем гадать на кофейной гуще.
Во-первых, я не знаю, для чего служит поле 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 срабатывает раньше, сортировка же работает для сформированных строк.
Тут, похоже, без вложенного запроса не обойтись.
Не получается вернуть нужную дату, потому что 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
Сортировка по дате сработала. Вот что получил

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

Спустя 2 часа, 50 минут (9.06.2012 - 20:51) neadekvat написал(а):
Сходу в голову приходит только копье ничего не приходит.
Но я бы посмотрел в сторону группировки и по полю стартер и по полю клиент, например. То есть как-то сделать так, чтобы значения этих полей рассматривались вместе. (DISCTINT starter, client или подобные конструкции).
Но я бы посмотрел в сторону группировки и по полю стартер и по полю клиент, например. То есть как-то сделать так, чтобы значения этих полей рассматривались вместе. (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 написал(а):
Спасибо за помощь