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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помощь в составлении запроса

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Вывод данных из базы
svoloch
Отправлено: 07 Апреля, 2011 - 10:54:57
Post Id



Новичок


Покинул форум
Сообщений всего: 34
Дата рег-ции: Нояб. 2009  


Помог: 0 раз(а)




Здравствуйте. Помогите, пожалуйста.

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

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

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

Заранее благодарен.
 
 Top
Viper
Отправлено: 07 Апреля, 2011 - 11:04:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




svoloch пишет:
чтобы первыми отображались тексты с новыми комментариями а дальше(в том же цикле) по убыванию по дате?
так они ж в любом случае сортируются по дате!? Или я не понял вашего замысла...

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


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
svoloch
Отправлено: 07 Апреля, 2011 - 11:33:19
Post Id



Новичок


Покинул форум
Сообщений всего: 34
Дата рег-ции: Нояб. 2009  


Помог: 0 раз(а)




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

То есть, при выводе мне надо в первую очередь выводить ту запись, к которой добавили последний комментарий, и так по убыванию.
 
 Top
Мелкий Супермодератор
Отправлено: 07 Апреля, 2011 - 11:41:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




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

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


-----
PostgreSQL DBA
 
 Top
svoloch
Отправлено: 07 Апреля, 2011 - 11:45:08
Post Id



Новичок


Покинул форум
Сообщений всего: 34
Дата рег-ции: Нояб. 2009  


Помог: 0 раз(а)




Мелкий пишет:
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() )
 
 Top
svoloch
Отправлено: 08 Апреля, 2011 - 20:19:33
Post Id



Новичок


Покинул форум
Сообщений всего: 34
Дата рег-ции: Нояб. 2009  


Помог: 0 раз(а)




Простите, но мне так никто и не поможет? Ребята, очень срочно надо.
 
 Top
Мелкий Супермодератор
Отправлено: 08 Апреля, 2011 - 20:59:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




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


-----
PostgreSQL DBA
 
 Top
svoloch
Отправлено: 08 Апреля, 2011 - 21:07:12
Post Id



Новичок


Покинул форум
Сообщений всего: 34
Дата рег-ции: Нояб. 2009  


Помог: 0 раз(а)




Мелкий пишет:
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 ;
 
 Top
Мелкий Супермодератор
Отправлено: 08 Апреля, 2011 - 21:29:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




До последнего байта под вашу задачу писать запрос не намерен. Недостающие поля можете сами дописать в запрос.


-----
PostgreSQL DBA
 
 Top
svoloch
Отправлено: 08 Апреля, 2011 - 21:33:40
Post Id



Новичок


Покинул форум
Сообщений всего: 34
Дата рег-ции: Нояб. 2009  


Помог: 0 раз(а)




Мелкий пишет:
До последнего байта под вашу задачу писать запрос не намерен. Недостающие поля можете сами дописать в запрос.
вписываю. но при добавлении остальных полей вывод вообще прекращается. То есть, выборка не дает ни одного результата.
 
 Top
Lozzie
Отправлено: 08 Апреля, 2011 - 22:55:57
Post Id


Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Апр. 2011  
Откуда: /usr/home/


Помог: 2 раз(а)




Цитата:
но при добавлении остальных полей вывод вообще прекращается.

Вывод не может прекратиться сам по себе. Либо у вас отсутствуют записи, удовлетворяющие условия выборки, либо ошибка в синтаксисе запроса. Почему бы не воспользоваться функцией mysql_error?
 
 Top
svoloch
Отправлено: 09 Апреля, 2011 - 03:04:09
Post Id



Новичок


Покинул форум
Сообщений всего: 34
Дата рег-ции: Нояб. 2009  


Помог: 0 раз(а)




Так. Если использовать данный запрос
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
, то записи сортируются по дате добавления, не учитывая комментарии.
 
 Top
Lozzie
Отправлено: 09 Апреля, 2011 - 03:59:52
Post Id


Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Апр. 2011  
Откуда: /usr/home/


Помог: 2 раз(а)




Почему бы не выбирать колонку с временем через условный оператор? Пример:
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`).

(Отредактировано автором: 09 Апреля, 2011 - 04:03:50)

 
 Top
svoloch
Отправлено: 09 Апреля, 2011 - 04:17:36
Post Id



Новичок


Покинул форум
Сообщений всего: 34
Дата рег-ции: Нояб. 2009  


Помог: 0 раз(а)




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. Такую структуру таблиц дали
 
 Top
Lozzie
Отправлено: 09 Апреля, 2011 - 05:00:52
Post Id


Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Апр. 2011  
Откуда: /usr/home/


Помог: 2 раз(а)




А с чего он должен работать? Это только пример. Я лишь хотел вам продемонстрировать реализацию с оператором IF(вместо подзапроса). А так, если к запросу добавить группировку и корректные условия выборки, то он сможет справиться с вашей задачей.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB