|
|
|
| Есть таблица пользователей user >(name, date) -имя и дата регистрации и есть отдельная таблица их сообщений message>(name, text, date) -имя, текст и дата добавления текста. Нужно вывести список пользователей(name) по дате последнего добавленного ими сообщения.
Вот пытался:
$last=mysql_query(select name from message GROUP BY `name` order by `date` desc");
$kol=mysql_num_rows($last);
for($i=0;$i<=$kol; $i++){
$name=mysql_result($last, $i, 'name');
echo "$name<br>";
}
|
Ещё пробовал упрощённый вариант:
$last=mysql_query(select DISTINCT name from message order by `date` desc");
|
Так даже проще, но и в первом и во втором случае почему-то пропускает многих пользователей - есть догадка, что поле `date` тоже объединяется из двух таблиц ... Может как-то можно уточнить что сортировка по `date` относится к сообщениям, а не пользователям. Или дело в чём-то другом? Кто может помочь? | |
|
|
|
|
|
|
|
для: Владимир22
(16.08.2007 в 23:27)
| | Помочь конечно можем, а сами. В задание вникните:
Нужно вывести список пользователей(name) по дате последнего добавленного ими сообщения.
|
А вы чего там пытайтесь сделать! | |
|
|
|
|
|
|
|
для: oradev
(17.08.2007 в 12:14)
| | Что-то ничего не могу понять, я же пользователей и вывожу... Плиз, подскажите, уже три дня бьюсь над этой проблемой! Догадываюсь где ошибка - выводит пользователей по дате из их таблицы, а надо по дате из таблицы сообщений. Надо делать вложенный запрос? Помогите разобраться! | |
|
|
|
|
|
|
|
для: oradev
(17.08.2007 в 12:14)
| |
SELECT u.name
FROM user u
JOIN
(SELECT user_id, MAX (date)
FROM message
GROUP BY user_id) m ON u.user_id = m.user_id
;
|
| |
|
|
|
|
|
|
|
для: oradev
(17.08.2007 в 12:51)
| | Одна поправочка в таблице user имена - name, а в таблице message имена - names.
Вот сделал, но что-то не хочет...
$last=mysql_query("SELECT u.name
FROM user u
JOIN
(SELECT user_id, MAX (date)
FROM message
GROUP BY user_id) m ON u.user_id = m.user_id " ;
$kol=mysql_num_rows($last);
for($i=0;$i<=$kol; $i++){
$names=mysql_result($last, $i, 'names');
echo "$names<br>";
|
| |
|
|
|
|
|
|
|
для: Владимир22
(17.08.2007 в 13:40)
| | А в чем проблема теперь ? | |
|
|
|
|
|
|
|
для: oradev
(17.08.2007 в 15:56)
| | oradev, я в MySql пока не силён, буду конечно изучать, но пока нет времени и надо сделать этот злополучный код, Понял, что всё предложенное не работает, уже пытаюсь решить проблему так: http://softtime.ru/forum/read.php?id_forum=3&id_theme=42148&page=1 | |
|
|
|
|
|
|
|
для: Владимир22
(17.08.2007 в 16:42)
| | Да я это заметил. Но как раз таки средствами MySQL данная задача решается весьма элементарно, поверьте. | |
|
|
|
|
|
|
|
для: oradev
(17.08.2007 в 16:48)
| | Есть таблица пользователей user >(name, date) -имя и дата регистрации
и есть отдельная таблица их сообщений message>(namesmes, text, date) -имя, текст и дата добавления текста. Объединяет эти таблицы общие и уникальные значения name и namesmes.
Нужно вывести список пользователей(name) по дате последнего добавленного ими сообщения. Принцип такой же как и на этом форуме: есть темы и в каждой много записей - как только добавлена новая запись тема выходит на первоей место.
Пожалуйста, помогите кто может! | |
|
|
|
|
|
|
|
для: Владимир22
(17.08.2007 в 17:05)
| | Я уже не знаю как расжевать, в любом случаи нужно читать книжки:
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
PL/SQL Release 9.2.0.1.0 - Production
CORE 9.2.0.1.0 Production
TNS for 32-bit Windows: Version 9.2.0.1.0 - Production
NLSRTL Version 9.2.0.1.0 - Production
SQL> drop table tbl_users;
Таблица удалена.
SQL> drop table tbl_messages;
Таблица удалена.
SQL> CREATE TABLE tbl_users
2 (
3 user_id NUMBER,
4 name VARCHAR2(20),
5 dat_reg DATE
6 );
Таблица создана.
SQL> CREATE TABLE tbl_messages
2 (
3 user_id NUMBER,
4 dat DATE,
5 mes_text VARCHAR2(20)
6 );
Таблица создана.
SQL> insert into tbl_users values (1,'Mark', date '2007-12-31');
1 строка создана.
SQL> insert into tbl_users values (2,'Stiven', date '2007-12-30');
1 строка создана.
SQL> insert into tbl_users values (3,'John', date '2007-10-31');
1 строка создана.
SQL>
SQL> insert into tbl_messages values (1,date '2008-01-12','one');
1 строка создана.
SQL> insert into tbl_messages values (1,date '2008-01-13','two');
1 строка создана.
SQL> insert into tbl_messages values (2,date '2008-02-12','one');
1 строка создана.
SQL> insert into tbl_messages values (2,date '2008-03-11','two');
1 строка создана.
SQL> insert into tbl_messages values (3,date '2008-04-12','one');
1 строка создана.
SQL> insert into tbl_messages values (3,date '2008-05-12','two');
1 строка создана.
SQL> insert into tbl_messages values (3,date '2009-05-12','three');
1 строка создана.
SQL> SELECT u.NAME, m.max_date
2 FROM tbl_users u
3 JOIN
4 (SELECT user_id, MAX (dat) AS max_date
5 FROM tbl_messages
6 GROUP BY user_id) m ON u.user_id = m.user_id
7 ORDER BY 2 DESC;
NAME MAX_DATE
-------------------- --------
John 12.05.09
Stiven 11.03.08
Mark 13.01.08
|
| |
|
|
|
|
|
|
|
для: oradev
(17.08.2007 в 22:15)
| | Oradev, огhомное спасибо!! Но опять не подходит.
Просто я не могу заново создавать новую таблицу.
Всё намного проще:
ВОТ ЧТО ЕСТЬ:
---------------------------------------
Таблица "User" (пользователи)
1) Имя > name
2) Дата регистрации > date
Таблица "Message" (сообщения)
1) Имя > namemes
2) Дата публикации > date
------------------------------------
namemes - это тот же уникальный name (т.е. пользователь name в таблице сообщений фигурирует как namemes
Никаких id, ничего такого больше нет.
Надо:
Вывести список пользователей (name) по дате их (namemes) последних сообщений.
Как будет выглядеть код на PHP (чтоб просто вставить в php-файл и всё) - говорю же в MySQL плохо разбираюсь.
Вот пытался изначально так:
$re=mysql_query("select namemes FROM message GROUP BY namemes order by `date` desc");
for($i=0;$i<=10; $i++){
$name=mysql_result($re, $i, 'name');
echo "$namemes<br>";
}
|
Но это всё неправильно.
Плиз, как правильно будет в контексте PHP! | |
|
|
|
|
|
|
|
для: Владимир22
(17.08.2007 в 22:50)
| | SELECT namemes, max(`date`) AS md GROUP BY namemess ORDER BY md DESC | |
|
|
|
|
|
|
|
для: Trianon
(18.08.2007 в 00:52)
| | Trianon, СПАСИБО преогромнейшее!!! Всё получилось наконец-то.
$re=mysql_query("SELECT namemes, max(`date`) AS md from message GROUP BY namemess ORDER BY md DESC");
for($i=0;$i<=10; $i++){
$namemes=mysql_result($re, $i, 'namemes');
$nomer=mysql_result($re, $i, 'nomer'); ///////////// добавил столбик "номер" для сообщений
echo "$namemes<br>";
}
| А можно маленькую поправку - как можно сделать так:
echo "<a href='message.htm?message=$nomer'>$namemes</a><br>";
т.е. чтобы при нажатии на имя($namemes) открывалось его последнее сообщение(по 'date').. Как можно подправить запрос с SELECT??? | |
|
|
|
|
|
|
|
для: Владимир22
(18.08.2007 в 14:34)
| | Ну и слава богу! | |
|
|
|
|
|
|
|
для: oradev
(18.08.2007 в 19:44)
| | oradev, ещё раз спасибо за помощь, но ВОПРОС ЕЩЁ ОТКРЫТ. | |
|
|
|
|
|
|
|
для: Владимир22
(18.08.2007 в 14:34)
| | Вы ни слова не сказали, что за номера хранятся в столбике. Запрос Ваш таких столбиков не вытаскивает вообще. А меж тем, ссылка, работоспособностью которой Вы интересуетесь, ничего кроме номера не поставляет. | |
|
|
|
|
|
|
|
для: Trianon
(20.08.2007 в 00:35)
| | Согласен, надо:
SELECT nomer, namemes, max(`date`) AS md from message GROUP BY namemess ORDER BY md DESC");
|
Номер обозначает номер сообщения пользователя, а текст сообщения генерируется уже в файле message.htm?message=$nomer
Т.о. нужно чтобы при нажатии на пользователя шёл переход на его последнее по дате сообщение. Trianon, спасибо за подсказку и участие. | |
|
|
|
|
|
|
|
для: Владимир22
(20.08.2007 в 00:55)
| | >А можно маленькую поправку - как можно сделать так:
>echo "<a href='message.htm?message=$nomer'>$namemes</a><br>";
ссылка ничего не говорит о том, что за пользователь по ней должен открываться. Говорит про номер сообщения только. То есть пользователь неизвестен, а номер известен.
А в задаче спрашивается наоборот - для известного пользователя вывести последнее (а вовсе не с конкретным номером ) сообщение. | |
|
|
|
|
|
|
|
для: Trianon
(20.08.2007 в 01:02)
| | А как тогда можно сделать? Т.е. при нажатии на ссылку с именем последнего пользователя вывести его последнее сообщение по дате ? Это разве можно сделать без участия номера?
Запутался немножко... | |
|
|
|
|
|
|
|
для: Владимир22
(21.08.2007 в 15:02)
| | Владимир22, данном случаи запрос еще более примитивен. | |
|
|
|
|
|
|
|
для: oradev
(21.08.2007 в 17:59)
| | oradev, а как сделать? Помоги, пожалуйста. | |
|
|
|
|
|
|
|
для: Владимир22
(21.08.2007 в 18:20)
| |
SELECT namemes, text
FROM MESSAGE
WHERE dat = (SELECT MAX (dat)
FROM MESSAGE
WHERE namemes = $param
GROUP BY namemes);
|
название полей на свои измените. | |
|
|
|
|
|
|
|
для: oradev
(21.08.2007 в 22:42)
| | Чтобы не быть северным варваром :)
SELECT namemes, text
FROM MESSAGE
WHERE (namemes, dat) = (SELECT namemes, MAX (dat)
FROM MESSAGE
WHERE namemes = $param1
GROUP BY namemes);
|
| |
|
|
|