Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборка последней новости из рубрики, group by 
:(
    Опции темы
In0stRAnez
  Дата 11.12.2015, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.3.2008

Репутация: нет
Всего: нет



Доброго времени суток коллеги!

Собственно вопрос в выборке новостей по категориям (рубрикам)

структура:  id, name, subname, img0, rubrik

В принципе я уже накаляла кое что... работает... 
но хотел бы Вашего мнения и по возможности оптимизации ибо коряво я написал)

Код

SELECT `n`.`id`, `n`.`name`, `n`.`subname`, `n`.`img0`, `n`.`rubrik`
                FROM `news` n
                WHERE `subname` <> ''
                AND `img0` <> ''
                AND `rubrik` LIKE '%-41-%' 
                OR `rubrik` LIKE '%-42-%'
                OR `rubrik` LIKE '%-43-%'
                OR `rubrik` LIKE '%-44-%'
                AND `n`.`id` = (SELECT MAX(`id`) FROM `news` 
                            WHERE `subname` <> '' AND `img0` <> '' AND `rubrik` LIKE '%-41-%' 
                                 OR `rubrik` LIKE '%-42-%' OR `rubrik` LIKE '%-43-%' OR `rubrik` LIKE '%-44-%'
                         )
                
                GROUP BY `rubrik`


единственное `subname` <> '' AND `img0` <> '' - почему то не работает, делается выборка даже если поля пустые! - а так не должно быть

Спасибо 

Это сообщение отредактировал(а) ksnk - 11.12.2015, 17:08
PM MAIL   Вверх
ksnk
Дата 11.12.2015, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Отредактировал сообщение, чтобы форум не корежило.

А данные в таблице какие? Поле rubrik на самом деле текстовое?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
ksnk
Дата 11.12.2015, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Вообще-то в новость нужно добавить поле - дата. Тогда все получится просто 
Код

SELECT `n`.`id`, `n`.`name`, `n`.`subname`, `n`.`img0`, `n`.`rubrik`, `n`.`data`
                FROM `news` n
...
ORDER BY `n`.`data` DESC LIMIT 1

Выбирать максимальный ID - это как-то не по базоданчески smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
In0stRAnez
Дата 12.12.2015, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.3.2008

Репутация: нет
Всего: нет



Цитата(ksnk @ 11.12.2015,  18:28)
Вообще-то в новость нужно добавить поле - дата. Тогда все получится просто 
Код

SELECT `n`.`id`, `n`.`name`, `n`.`subname`, `n`.`img0`, `n`.`rubrik`, `n`.`data`
                FROM `news` n
...
ORDER BY `n`.`data` DESC LIMIT 1

Выбирать максимальный ID - это как-то не по базоданчески smile

задача вывести одним запросом 1 последнюю новость каждой из 4 рубрик

т.е. результат будет 4 новости по разным темам (общество, организации, самодеятельность и т д)

Код

CREATE TABLE IF NOT EXISTS `news` (
`id` bigint(8) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `subname` text NOT NULL,
  `alt` text,
  `img0` varchar(255) NOT NULL,
  `img1` varchar(255) NOT NULL,
  `img2` varchar(255) NOT NULL,
  `picm` varchar(255) DEFAULT NULL,
  `picb` varchar(255) DEFAULT NULL,
  `interviewImg` varchar(255) NOT NULL,
  `date` varchar(255) NOT NULL,
  `text` text,
  `author` varchar(255) DEFAULT NULL,
  `expert` varchar(255) DEFAULT NULL,
  `rubrik` varchar(255) DEFAULT NULL,
  `story` varchar(255) DEFAULT NULL,
  `region` varchar(255) DEFAULT NULL,
  `coment` varchar(32) DEFAULT NULL,
  `tags` varchar(255) NOT NULL,
  `is_important` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `is_highlight` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `is_main` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `tip` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `e_choise` int(1) NOT NULL DEFAULT '0',
  `hide_date` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `is_vis` tinyint(1) unsigned NOT NULL DEFAULT '0'
) ENGINE=MyISAM AUTO_INCREMENT=27548 DEFAULT CHARSET=utf8;

PM MAIL   Вверх
ksnk
Дата 12.12.2015, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Цитата(In0stRAnez @  11.12.2015,  16:23 Найти цитируемый пост)
 делается выборка даже если поля пустые!

Вот это, как раз, понятно, приоритет операции AND больше OR. Надо взять блок OR'ов в скобки.

Цитата(In0stRAnez @  12.12.2015,  00:18 Найти цитируемый пост)
`date` varchar(255) NOT NULL,

Оригинальный способ работы с датой. DATETIME - значительно правильнее.

Финальный запрос мог бы быть таким
Код

SELECT `n`.`id`, `n`.`name`, `n`.`subname`, `n`.`img0`, `n`.`rubrik`
FROM `news` n
WHERE `n`.`id` in (
  select max(id) from news where `subname` <> ''
    AND `img0` <> ''
    AND (`rubrik` LIKE '%-41-%'
      OR `rubrik` LIKE '%-42-%'
      OR `rubrik` LIKE '%-43-%'
      OR `rubrik` LIKE '%-44-%')
  group by rubrik
)

Если не перекодировать дату в приличный вид, или  ( select max(date) ...  если собраться с силами и поставить правильный тип у даты.



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
In0stRAnez
Дата 14.12.2015, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.3.2008

Репутация: нет
Всего: нет



Спасибо)) Все четко)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.1305 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.