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

Форум MySQL

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

 

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

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

тема: Сортировка данных
 
 автор: mihdan   (19.03.2009 в 14:04)   письмо автору
 
 

Есть таблица themes

id | name | sort(int)


И таблица news

id | theme_id | name | content | date


Задача: сортировать так

Сначала берем темы, где заполнено поле sort - сортируем по нему,
затем берем темы, где не заполнено поле sort и сортируем темы таким образом, чтобы сверху были темы, в которые последними добавлены новости. Тупо если добавили новую новость в тему, то она должна быть первой среди тем, у которых не заполнено поле sort.

Не могу надумать алгоритм. Поможите. Заранее благодарен

  Ответить  
 
 автор: Slo_Nik   (19.03.2009 в 15:13)   письмо автору
 
   для: mihdan   (19.03.2009 в 14:04)
 

во - первых, тема не совсем подходит для этого раздела, тебе надо скорей всего в раздел по БД.
во - вторых,что это за поле такое, sort и почему ты хочешь сортировать именно по этому полю?
сортировать, я думаю, лучше по дате и времени добавления новости. а условия сортировки задавай при выборке записей из БД при помощи ORDER BY, DESC или ASC.

  Ответить  
 
 автор: mihdan   (20.03.2009 в 10:55)   письмо автору
 
   для: Slo_Nik   (19.03.2009 в 15:13)
 

Нда....да не новости сортировать, а темы. Функцию сортировки на РНР писать, mysql тут не при чем
Sort - поле для сортировки тем, а не новостей. Администратор сам выбирает какая тема важнее в данный момент, указывает ей позций "1" - она становится первой в меню, все остальные темы сортируются по принципу, описанному выше.

  Ответить  
 
 автор: Root   (20.03.2009 в 11:11)   письмо автору
 
   для: mihdan   (20.03.2009 в 10:55)
 

SELECT t.*, n.* FROM theme AS t
  LEFT JOIN news AS n
  ON t.id = n.theme_id
  ORDER BY t.sort DESC,
  `date` DESC;

  Ответить  
 
 автор: mihdan   (20.03.2009 в 11:57)   письмо автору
 
   для: Root   (20.03.2009 в 11:11)
 

Как отсортировать темы по новостям я знаю как. Не могу придумать алгоритм связи с первой сортировкой

  Ответить  
 
 автор: mihdan   (20.03.2009 в 12:50)   письмо автору
 
   для: Root   (20.03.2009 в 11:11)
 

Но все равно спасибо и на этом

  Ответить  
 
 автор: mihdan   (23.03.2009 в 11:27)   письмо автору
 
   для: mihdan   (20.03.2009 в 12:50)
 

up

  Ответить  
 
 автор: Trianon   (23.03.2009 в 11:33)   письмо автору
 
   для: mihdan   (19.03.2009 в 14:04)
 

SELECT t.*, MAX(n.`date`) AS md  
  FROM theme t
    LEFT JOIN news n ON t.id = n.theme_id
  GROUP BY t.id,
  ORDER BY t.sort DESC,
  `md` DESC;

  Ответить  
 
 автор: mihdan   (23.03.2009 в 14:55)   письмо автору
 
   для: Trianon   (23.03.2009 в 11:33)
 

Как всегда на высоте. Только есть одна проблема: поле theme_id - varchar(50) и данные в нем вида


-10--11--3-


То есть в нем хранятся несколько ID каждое из которых обрамлено в "-"

  Ответить  
 
 автор: Trianon   (23.03.2009 в 15:27)   письмо автору
 
   для: mihdan   (23.03.2009 в 14:55)
 

ну и кто ССЗБ?

Собственно, если в themes.id и в news.theme_id хранятся одни и те же значения (будь они сами по себе хоть фиолетовыми в крапинку) код будет работать.

Если же значения разные - Вы не имели права формулировать задачу так, как написали в исходном посте.

В любом случае хранить ключи списком в поле - неправильно.

  Ответить  
 
 автор: mihdan   (23.03.2009 в 16:20)   письмо автору
 
   для: Trianon   (23.03.2009 в 15:27)
 

themes.id и в news.theme_id разные:
themes.id - int
news.theme_id - varchar

>В любом случае хранить ключи списком в поле - неправильно.
так уж спроектировали базу в 1997 году ;(

  Ответить  
 
 автор: Trianon   (23.03.2009 в 16:50)   письмо автору
 
   для: mihdan   (23.03.2009 в 16:20)
 

>>В любом случае хранить ключи списком в поле - неправильно.
>так уж спроектировали базу в 1997 году ;(

Что ж Вы её до сих пор не переделали? :)

Основы реляционной теории БД были спроектированы Е. Коддом в 1970 году.
Так что за отмазку не канает причина не выдерживает критики.

  Ответить  
 
 автор: mihdan   (23.03.2009 в 17:16)   письмо автору
 
   для: Trianon   (23.03.2009 в 16:50)
 

Отмазок нет.
Переделал так, добавив таблицу связи

news_to_theme

id | id_new | id_theme


Проект пришел на доработку, полную переделку осуществить нет возможности из-за отсутствия времени и капитала.

ЗЫ: и все-таки хотелось бы узнать, возможно ли было сделать все это безе переделки структуры базы? Например, через LIKE

  Ответить  
 
 автор: Trianon   (23.03.2009 в 17:20)   письмо автору
 
   для: mihdan   (23.03.2009 в 17:16)
 

>ЗЫ: и все-таки хотелось бы узнать, возможно ли было сделать все это безе переделки структуры базы?

Вам даже в голову не пришло объяснить, что за числа хранятся в этом списке.
Я тем более гадать не буду.
Одно могу сказать - Вам придется придумать выражение, которое вычисляется как истина, когда строка одной таблицы соответствует строке другой, и как ложь, когда не соответствует. И поставить его в раздел ON соединения таблиц.

  Ответить  
 
 автор: mihdan   (23.03.2009 в 17:37)   письмо автору
 
   для: Trianon   (23.03.2009 в 17:20)
 

>Вам даже в голову не пришло объяснить, что за числа хранятся в этом списке. Я тем более гадать не буду.

theme_id - поле хранит идентификаторы тем из таблицы themes

>Вам придется придумать выражение, которое вычисляется как истина, когда строка одной таблицы соответствует строке другой, и как ложь, когда не соответствует. И поставить его в раздел ON соединения таблиц.

В это-то и проблема, поэтому и обращаюсь постоянно к вам (гуру sql) за помощью

  Ответить  
 
 автор: Trianon   (23.03.2009 в 17:58)   письмо автору
 
   для: mihdan   (23.03.2009 в 17:37)
 

ON LOCATE(CONCAT('-', themes.id, '-'), news.theme_id)

  Ответить  
 
 автор: mihdan   (23.03.2009 в 18:47)   письмо автору
 
   для: Trianon   (23.03.2009 в 17:58)
 

5+

Спасибо

  Ответить  
Rambler's Top100
вверх

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