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

Форум MySQL

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

 

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

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

тема: Выборка одной статьи каждого автора
 
 автор: mihdan   (21.10.2012 в 10:20)   письмо автору
 
 

Дано: 2 таблицы - статьи и авторы. Задача: вывести на экран 6 последних публикаций разных авторов.

Таблица авторов:


CREATE TABLE IF NOT EXISTS `crm_persons` (
  `id_person` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `surname_ru` varchar(255) NOT NULL,
  `name_ru` varchar(255) NOT NULL,
  `patronymic_ru` varchar(255) NOT NULL,  
  `photo_120x90` varchar(200) NOT NULL,
  `id_country` int(10) unsigned NOT NULL DEFAULT '0',
  `id_region` int(10) unsigned NOT NULL DEFAULT '0',
  `id_city` int(10) unsigned NOT NULL DEFAULT '0',
  `id_subway` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id_person`),
  KEY `id_country` (`id_country`),
  KEY `id_region` (`id_region`),
  KEY `id_city` (`id_city`),
  KEY `surname_ru` (`surname_ru`),
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='Список персоналей' 


Таблица статьи:


CREATE TABLE IF NOT EXISTS `crm_news` (
  `id` bigint(8) NOT NULL AUTO_INCREMENT,
  `id_rubric` bigint(8) NOT NULL DEFAULT '0',
  `id_region` varchar(30) NOT NULL DEFAULT '0',
  `id_theme` varchar(30) NOT NULL DEFAULT '',
  `id_plot` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Сюжет',
  `type` int(4) NOT NULL DEFAULT '0',
  `name_ru` varchar(255) NOT NULL DEFAULT '',
  `date` datetime NOT NULL,
  `date_start` date NOT NULL DEFAULT '0000-00-00' COMMENT 'Дата начала показа события',
  `date_end` date NOT NULL DEFAULT '0000-00-00' COMMENT 'Дата завершения показа события',
  `id_person` int(10) unsigned NOT NULL DEFAULT '0',
  `announcement_ru` text NOT NULL,
  `content_ru` longtext NOT NULL,
  PRIMARY KEY (`id`),
  KEY `id_rubric` (`id_rubric`),
  KEY `id_region` (`id_region`),
  KEY `id_theme` (`id_theme`),
  KEY `name_ru` (`name_ru`),
  KEY `subname_ru` (`subname_ru`),
  KEY `date` (`date`),
  KEY `id_person` (`id_person`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO


Делаю запрос:


              SELECT
                      `p`.`id_person`,
                      `p`.`photo_120x90`,
                      CONCAT_WS   (' ', `p`.`name_ru`, `p`.`surname_ru`) AS `author`,
                      `n`.`id`  AS  `id_new`,
                      `n`.`name_ru` AS  `name`,
                      `n`.`announcement_ru` AS  `announcement`
              FROM        `crm_persons` AS  `p`
              LEFT JOIN  `crm_news` AS  `n` ON `n`.`id_person` = `p`.`id_person`
              WHERE       `n`.`type` = 6
              AND         `p`.`photo_120x90` <> ''
              AND         `p`.`surname_{$lng}` <> ''
              AND         `p`.`name_{$lng}` <> ''
              AND         `n`.`name_{$lng}` <> ''
              AND         `n`.`announcement_{$lng}` <> ''
              GROUP BY `n`.`id_person`

              ORDER   BY  `n`.`date`  DESC
              LIMIT   6


Выводит 6 публикаций, сгруппированных по автору, но не последние. Что может быть тут не так? Или как сделать правильно?

  Ответить  
 
 автор: cheops   (21.10.2012 в 14:14)   письмо автору
 
   для: mihdan   (21.10.2012 в 10:20)
 

Вместо самих таблиц, используйте в конструкции LEFT JOIN сами вложенные запросы.

  Ответить  
 
 автор: mihdan   (21.10.2012 в 17:07)   письмо автору
 
   для: cheops   (21.10.2012 в 14:14)
 

Не совсем понял, что вы имеете ввиду

  Ответить  
 
 автор: mihdan   (22.10.2012 в 12:34)   письмо автору
 
   для: cheops   (21.10.2012 в 14:14)
 

Игорь Вячеславович, можно на пальцах?

  Ответить  
 
 автор: cheops   (22.10.2012 в 18:57)   письмо автору
 
   для: mihdan   (22.10.2012 в 12:34)
 

Выберите 6 последних новостей разных авторов, обозначьте эту выборку отдельной таблицей, скажем при помощи AS `n`, а потом уже при помощи LEFT JOIN навешивайте на неё авторов, т.е. что-то в этом духе.
SELECT 
  `p`.`id_person`, 
  `p`.`photo_120x90`, 
  CONCAT_WS   (' ', `p`.`name_ru`, `p`.`surname_ru`) AS `author`, 
  `n`.`id`  AS  `id_new`, 
  `n`.`name_ru` AS  `name`, 
  `n`.`announcement_ru` AS  `announcement`,
  `n`.`date`
FROM
 (SELECT
    *
  FROM
    `crm_news`
  GROUP BY
    id_person
  ORDER BY
    `date` DESC
  LIMIT 6) AS  `n`
LEFT JOIN
 `crm_persons` AS `p`
ON
  `n`.`id_person` = `p`.`id_person`

  Ответить  
 
 автор: mihdan   (23.10.2012 в 00:34)   письмо автору
 
   для: cheops   (22.10.2012 в 18:57)
 

Сортировка идет не по дате: выводит как и мой запрос, самые первые новости каждого автора.

Пока остановился на таком варианте:


            SELECT
              p.id_person,
              p.photo_120x90,
              n.id  AS  id_new,
              n.announcement_ru AS  announcement,
              CONCAT_WS   (' ', p.name_ru, p.surname_ru) AS author
            FROM crm_news AS  n
              LEFT JOIN crm_news AS n1 ON (
                n.id_person = n1.id_person AND
                n1.`date` > n.`date`
              )
              LEFT JOIN crm_persons AS p ON n.id_person = p.id_person
            WHERE
              n1.`date` IS NULL AND
              n.type = 6 AND
              n.id_person > 0 AND
              p.photo_120x90 <> '' AND
              p.surname_ru <> '' AND
              p.name_ru <> '' AND
              n.announcement_ru <> ''
            ORDER   BY  n.`date`  DESC
            LIMIT   6

  Ответить  
 
 автор: cheops   (23.10.2012 в 09:33)   письмо автору
 
   для: mihdan   (23.10.2012 в 00:34)
 

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

  Ответить  
 
 автор: mihdan   (23.10.2012 в 16:33)   письмо автору
 
   для: cheops   (23.10.2012 в 09:33)
 

Отослал

  Ответить  
 
 автор: Sfinks   (26.10.2012 в 10:50)   письмо автору
 
   для: mihdan   (21.10.2012 в 10:20)
 

Думаю, как-то так:
/*<?*/
SELECT t.*
     , 
id id_new
     
name_ru name
     
announcement_ru announcement
FROM
SELECT id_person
           
photo_120x90
           
concat_ws' 'p.name_rusurname_ru )author
           
max(`date`)dt
      FROM crm_persons p
      JOIN crm_news n USING
id_person )
      
WHERE `type`=6
        
AND photo_120x90 <> ''
        
AND surname_ru <> ''
        
AND p.name_ru <> ''
        
AND n.name_ru <> ''
        
AND announcement_ru <> ''
      
GROUP BY id_personphoto_120x90p.name_rusurname_ru
      ORDER BY dt DESC
      LIMIT 6
)t
JOIN crm_news n
ON n
.id_person t.id_person AND dt = `date`

  Ответить  
 
 автор: mihdan   (26.10.2012 в 13:30)   письмо автору
 
   для: Sfinks   (26.10.2012 в 10:50)
 

Спасибо за вариант

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

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