|
|
|
| Дано: 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 публикаций, сгруппированных по автору, но не последние. Что может быть тут не так? Или как сделать правильно? | |
|
|
|
|
|
|
|
для: mihdan
(21.10.2012 в 10:20)
| | Вместо самих таблиц, используйте в конструкции LEFT JOIN сами вложенные запросы. | |
|
|
|
|
|
|
|
для: cheops
(21.10.2012 в 14:14)
| | Не совсем понял, что вы имеете ввиду | |
|
|
|
|
|
|
|
для: cheops
(21.10.2012 в 14:14)
| | Игорь Вячеславович, можно на пальцах? | |
|
|
|
|
|
|
|
для: 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`
|
| |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: mihdan
(23.10.2012 в 00:34)
| | Без дампа сложно воспроизвести ситуацию, вручную я набил лишь несколько записей. Вышлите кусочек дампа на почту, я могу попробовать отладить запрос с вложенными запросами. | |
|
|
|
|
|
|
|
для: cheops
(23.10.2012 в 09:33)
| | Отослал | |
|
|
|
|
|
|
|
для: 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_ru, surname_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_person, photo_120x90, p.name_ru, surname_ru
ORDER BY dt DESC
LIMIT 6
)t
JOIN crm_news n
ON n.id_person = t.id_person AND dt = `date`
|
| |
|
|
|
|
|
|
|
для: Sfinks
(26.10.2012 в 10:50)
| | Спасибо за вариант | |
|
|
|