Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проблема с выводом данных на основе двух таблиц
 
 автор: Владимир22   (16.08.2007 в 23:27)   письмо автору
 
 

Есть таблица пользователей 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` относится к сообщениям, а не пользователям. Или дело в чём-то другом? Кто может помочь?

   
 
 автор: oradev   (17.08.2007 в 12:14)   письмо автору
 
   для: Владимир22   (16.08.2007 в 23:27)
 

Помочь конечно можем, а сами. В задание вникните:

Нужно вывести список пользователей(name) по дате последнего добавленного ими сообщения. 


А вы чего там пытайтесь сделать!

   
 
 автор: Владимир22   (17.08.2007 в 12:45)   письмо автору
 
   для: oradev   (17.08.2007 в 12:14)
 

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

   
 
 автор: oradev   (17.08.2007 в 12:51)   письмо автору
 
   для: 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
       ;

   
 
 автор: Владимир22   (17.08.2007 в 13:40)   письмо автору
 
   для: 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>"; 

   
 
 автор: oradev   (17.08.2007 в 15:56)   письмо автору
 
   для: Владимир22   (17.08.2007 в 13:40)
 

А в чем проблема теперь ?

   
 
 автор: Владимир22   (17.08.2007 в 16:42)   письмо автору
 
   для: oradev   (17.08.2007 в 15:56)
 

oradev, я в MySql пока не силён, буду конечно изучать, но пока нет времени и надо сделать этот злополучный код, Понял, что всё предложенное не работает, уже пытаюсь решить проблему так: http://softtime.ru/forum/read.php?id_forum=3&id_theme=42148&page=1

   
 
 автор: oradev   (17.08.2007 в 16:48)   письмо автору
 
   для: Владимир22   (17.08.2007 в 16:42)
 

Да я это заметил. Но как раз таки средствами MySQL данная задача решается весьма элементарно, поверьте.

   
 
 автор: Владимир22   (17.08.2007 в 17:05)   письмо автору
 
   для: oradev   (17.08.2007 в 16:48)
 

Есть таблица пользователей user >(name, date) -имя и дата регистрации
и есть отдельная таблица их сообщений message>(namesmes, text, date) -имя, текст и дата добавления текста. Объединяет эти таблицы общие и уникальные значения name и namesmes.
Нужно вывести список пользователей(name) по дате последнего добавленного ими сообщения. Принцип такой же как и на этом форуме: есть темы и в каждой много записей - как только добавлена новая запись тема выходит на первоей место.
Пожалуйста, помогите кто может!

   
 
 автор: oradev   (17.08.2007 в 22:15)   письмо автору
 
   для: Владимир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          

   
 
 автор: Владимир22   (17.08.2007 в 22:50)   письмо автору
 
   для: 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!

   
 
 автор: Trianon   (18.08.2007 в 00:52)   письмо автору
 
   для: Владимир22   (17.08.2007 в 22:50)
 

SELECT namemes, max(`date`) AS md GROUP BY namemess ORDER BY md DESC

   
 
 автор: Владимир22   (18.08.2007 в 14:34)   письмо автору
 
   для: 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???

   
 
 автор: oradev   (18.08.2007 в 19:44)   письмо автору
 
   для: Владимир22   (18.08.2007 в 14:34)
 

Ну и слава богу!

   
 
 автор: Владимир22   (18.08.2007 в 19:53)   письмо автору
 
   для: oradev   (18.08.2007 в 19:44)
 

oradev, ещё раз спасибо за помощь, но ВОПРОС ЕЩЁ ОТКРЫТ.

   
 
 автор: Trianon   (20.08.2007 в 00:35)   письмо автору
 
   для: Владимир22   (18.08.2007 в 14:34)
 

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

   
 
 автор: Владимир22   (20.08.2007 в 00:55)   письмо автору
 
   для: 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, спасибо за подсказку и участие.

   
 
 автор: Trianon   (20.08.2007 в 01:02)   письмо автору
 
   для: Владимир22   (20.08.2007 в 00:55)
 

>А можно маленькую поправку - как можно сделать так:
>echo "<a href='message.htm?message=$nomer'>$namemes</a><br>";

ссылка ничего не говорит о том, что за пользователь по ней должен открываться. Говорит про номер сообщения только. То есть пользователь неизвестен, а номер известен.

А в задаче спрашивается наоборот - для известного пользователя вывести последнее (а вовсе не с конкретным номером ) сообщение.

   
 
 автор: Владимир22   (21.08.2007 в 15:02)   письмо автору
 
   для: Trianon   (20.08.2007 в 01:02)
 

А как тогда можно сделать? Т.е. при нажатии на ссылку с именем последнего пользователя вывести его последнее сообщение по дате ? Это разве можно сделать без участия номера?
Запутался немножко...

   
 
 автор: oradev   (21.08.2007 в 17:59)   письмо автору
 
   для: Владимир22   (21.08.2007 в 15:02)
 

Владимир22, данном случаи запрос еще более примитивен.

   
 
 автор: Владимир22   (21.08.2007 в 18:20)   письмо автору
 
   для: oradev   (21.08.2007 в 17:59)
 

oradev, а как сделать? Помоги, пожалуйста.

   
 
 автор: oradev   (21.08.2007 в 22:42)   письмо автору
 
   для: Владимир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   (22.08.2007 в 10:28)   письмо автору
 
   для: 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);

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования