Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Помощь в составлении запроса
Форумы портала PHP.SU » PHP » Напишите за меня, пожалуйста » Помощь в составлении запроса

Страниц (2): [1] 2 »
 

1. svoloch - 07 Апреля, 2011 - 10:54:57 - перейти к сообщению
Здравствуйте. Помогите, пожалуйста.

Имеем две таблицы mysql, тексты и комментарии.

texts (id, text, data)
comments (id, text_id, comment, data)

Каким запросом выводить из базы список записей, чтобы первыми отображались тексты с новыми комментариями а дальше(в том же цикле) по убыванию по дате?

Заранее благодарен.
2. Viper - 07 Апреля, 2011 - 11:04:14 - перейти к сообщению
svoloch пишет:
чтобы первыми отображались тексты с новыми комментариями а дальше(в том же цикле) по убыванию по дате?
так они ж в любом случае сортируются по дате!? Или я не понял вашего замысла...

Вообще есть ORDER BY `date_field`DESC
3. svoloch - 07 Апреля, 2011 - 11:33:19 - перейти к сообщению
Viper пишет:
svoloch пишет:
чтобы первыми отображались тексты с новыми комментариями а дальше(в том же цикле) по убыванию по дате?
так они ж в любом случае сортируются по дате!? Или я не понял вашего замысла...

Вообще есть ORDER BY `date_field`DESC

Да, так они сортируются по дате.

НО! Мне необходимо организовать вывод с учетом даты добавления комментария.

Пример

Имеем 3 записи.
1 - дата публикации 05.04.2011, комментариев 3(последний 07.04.2011 в 16:30)
2 - дата публикации 06.04.2011, комментариев 0
3 - дата публикации 07.04.2011, комментариев 1(последний 07.04.2011 в 12:15)

И вывести мне эти записи надо в таком порядке - 1, 3, 2

То есть, при выводе мне надо в первую очередь выводить ту запись, к которой добавили последний комментарий, и так по убыванию.
4. Мелкий - 07 Апреля, 2011 - 11:41:46 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `text`, `data`, `id` AS tid (SELECT max(`data`) FROM `comments` WHERE `comments`.`id`=tid) AS cdate FROM `texts` ORDER BY `cdate` DESC

Если не наглючил
5. svoloch - 07 Апреля, 2011 - 11:45:08 - перейти к сообщению
Мелкий пишет:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `text`, `data`, `id` AS tid (SELECT max(`data`) FROM `comments` WHERE `comments`.`id`=tid) AS cdate FROM `texts` ORDER BY `cdate` DESC

Если не наглючил

Накосячил =) Вообще нифига не выводит)
(Добавление)
Ах да, если имеет значение - дата в таблицу пишется в unix-формате(с функции time() )
6. svoloch - 08 Апреля, 2011 - 20:19:33 - перейти к сообщению
Простите, но мне так никто и не поможет? Ребята, очень срочно надо.
7. Мелкий - 08 Апреля, 2011 - 20:59:10 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `text`, `data`, `id` AS tid, (SELECT max(`data`) FROM `comments` WHERE `comments`.`text_id`=tid) AS cdate FROM `texts` ORDER BY `cdate` DESC
8. svoloch - 08 Апреля, 2011 - 21:07:12 - перейти к сообщению
Мелкий пишет:
SELECT `text`, `data`, `id` AS tid, (SELECT max(`data`) FROM `comments` WHERE `comments`.`text_id`=tid) AS cdate FROM `texts` ORDER BY `cdate` DESC
Так выводит все записи, но данные записей не выводятся. Точнее только текст записи. А надо так же получить id запси, id юзера, добавившего запись. В общем, надо получить все записи из таблицы.
(Добавление)
Даю точную структуру таблиц

Texts
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE IF NOT EXISTS `texts` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `text` longtext NOT NULL,
  4.   `uid` int(11) NOT NULL DEFAULT '1',
  5.   `date` int(11) NOT NULL,
  6.   PRIMARY KEY  (`id`)
  7. ) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=2006 ;


Comments
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE IF NOT EXISTS `comments` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `tid` int(11) NOT NULL,
  4.   `uid` int(11) NOT NULL,
  5.   `comm` varchar(256) NOT NULL,
  6.   `date` int(11) NOT NULL,
  7.   PRIMARY KEY  (`id`)
  8. ) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=3 ;
9. Мелкий - 08 Апреля, 2011 - 21:29:28 - перейти к сообщению
До последнего байта под вашу задачу писать запрос не намерен. Недостающие поля можете сами дописать в запрос.
10. svoloch - 08 Апреля, 2011 - 21:33:40 - перейти к сообщению
Мелкий пишет:
До последнего байта под вашу задачу писать запрос не намерен. Недостающие поля можете сами дописать в запрос.
вписываю. но при добавлении остальных полей вывод вообще прекращается. То есть, выборка не дает ни одного результата.
11. Lozzie - 08 Апреля, 2011 - 22:55:57 - перейти к сообщению
Цитата:
но при добавлении остальных полей вывод вообще прекращается.

Вывод не может прекратиться сам по себе. Либо у вас отсутствуют записи, удовлетворяющие условия выборки, либо ошибка в синтаксисе запроса. Почему бы не воспользоваться функцией mysql_error?
12. svoloch - 09 Апреля, 2011 - 03:04:09 - перейти к сообщению
Так. Если использовать данный запрос
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `text`, `date`, `id`, `uid` AS tid, (SELECT max(`date`) FROM `comments` WHERE `comments`.`tid`=tid) AS cdate FROM `texts` ORDER BY `date` DESC
, то записи сортируются по дате добавления, не учитывая комментарии.
13. Lozzie - 09 Апреля, 2011 - 03:59:52 - перейти к сообщению
Почему бы не выбирать колонку с временем через условный оператор? Пример:
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT texts.id, texts.text, IF(MAX(comments.date) > 0, MAX(comments.date), texts.date) AS date
  3. FROM texts, comments
  4. WHERE texts.id = comments.tid ORDER BY date ASC
  5.  

P.S: Пример на статус идеального решения не претендует. Но в пять утра что-то удачнее не придумать.
P.P.S: Так и не понял, зачем поле даты int(11), когда unix-timestamp укладывается в int(10) unsigned. А колонку uid можно убрать, добавив UNIQUE KEY (`id`).
14. svoloch - 09 Апреля, 2011 - 04:17:36 - перейти к сообщению
Lozzie пишет:
Почему бы не выбирать колонку с временем через условный оператор? Пример:
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT texts.id, texts.text, IF(MAX(comments.date) > 0, MAX(comments.date), texts.date) AS date
  3. FROM texts, comments
  4. WHERE texts.id = comments.tid ORDER BY date ASC
  5.  

P.S: Пример на статус идеального решения не претендует. Но в пять утра что-то удачнее не придумать.
P.P.S: Так и не понял, зачем поле даты int(11), когда unix-timestamp укладывается в int(10) unsigned. А колонку uid можно убрать, добавив UNIQUE KEY (`id`).

Не работает((
P.S. Такую структуру таблиц дали
15. Lozzie - 09 Апреля, 2011 - 05:00:52 - перейти к сообщению
А с чего он должен работать? Это только пример. Я лишь хотел вам продемонстрировать реализацию с оператором IF(вместо подзапроса). А так, если к запросу добавить группировку и корректные условия выборки, то он сможет справиться с вашей задачей.

 

Powered by ExBB FM 1.0 RC1