|
|
|
|
таб cat категории
id p_id name
таб img картинки
id id_cat title
связь id -->id_cat
|
надо выбрать по одной картинке (последней -добавленной) в каждой категории
SELECT `c`.`name` , `tt`.`title`, `tt`.`id`
FROM `categories` AS `c`
JOIN (
SELECT `id_cat` , `title`,`id`
FROM `img`
GROUP BY `id_cat`
) AS `tt` ON `tt`.`id_cat` = `c`.id
WHERE `c`.`p_id` !=0
|
выбирает по первой добавленной в каждую категорию, что не так как хотелось
а запрос не правильно работает
SELECT max( id )
FROM `img`
WHERE `id`
IN ( 10, 11, 12 )
|
как вообще избавиться от GROUP BY | |
|
|
|
|
|
|
|
для: oliss
(12.04.2010 в 10:28)
| | Во внутреннем запросе
SELECT `id_cat` , `title`,`id`
FROM `img`
GROUP BY `id_cat`
|
семантическая неоднозначность по полям `title`,`id`
ключ последней картинки в категории получают так:
SELECT `id_cat` , MAX(`id`) AS last_img_id
FROM `img`
GROUP BY `id_cat`
|
(Чтоб быстро было - нужен индекс по id_cat само собой. )
Дальше берем категории, джоиним их с таблицей последних ключей, а то, что получилось - с таблицей картинок. Чтобы title выцепить.
Все обращения идут по индексам первичных ключей . Всё летает.
по поводу того, что выбирается первая, а не последняя - странно.
SHOW CREATE TABLE's приведите пожалуйста. А заодно и несколько строк из дампа данных.
А то ни типы не видны, ни наполнение.
Вообще-то если id заполнялись автоинкрементом, SELECT MAX(id) должно давать последний ключ. | |
|
|
|
|
|
|
|
для: Trianon
(12.04.2010 в 11:15)
| | Да нужна последняя добавленная картинка с каждой директории
это облегченный вариант таблиц
--
-- Структура таблицы `img`
--
CREATE TABLE IF NOT EXISTS `img` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`id_cat` int(10) unsigned NOT NULL,
`title` varchar(255) NOT NULL DEFAULT 'NOT NULL',
PRIMARY KEY (`id`),
KEY `id_cat` (`id_cat`),
FULLTEXT KEY `title` (`title`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
--
-- Дамп данных таблицы `img`
--
INSERT INTO `img` (`id`, `id_cat`, `title`) VALUES
(1, 3, 'Kristen Stewart'),
(2, 3, 'Kristen Stewart'),
(3, 3, 'Mena Suvari'),
(4, 4, 'Heidi Klum'),
(5, 4, 'Collien Fernandes'),
(6, 4, 'Ana Beatriz Barros'),
(7, 4, 'Ana Beatriz Barros'),
(8, 6, 'GMC Yukon Denali'),
(9, 5, 'Stacy Keibler'),
(10,6, 'Toyota Land Cruiser Prado');
--
-- Структура таблицы `categories`
--
CREATE TABLE IF NOT EXISTS `categories` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`p_id` int(10) unsigned NOT NULL,
`url` varchar(100) NOT NULL DEFAULT 'NOT NULL',
`hide_menu` enum('show','hide') NOT NULL DEFAULT 'show',
PRIMARY KEY (`id`),
UNIQUE KEY `url` (`url`),
KEY `p_id` (`p_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- Дамп данных таблицы `categories`
--
INSERT INTO `categories` (`id`, `p_id`, `url`, `hide_menu`) VALUES
(1, 0, 'girls', 'show'),
(2, 0, 'cars', 'show'),
(3, 1, 'celebrities', 'show'),
(4, 1, 'models', 'show'),
(5, 1, 'beauties', 'show'),
(6, 2, '4x4', 'show');
|
| |
|
|
|
|
|
|
|
для: oliss
(12.04.2010 в 17:20)
| | И я так понял, сложный запрос составить не получилось?
Кое-какие комментарии в схожей ситуации я изложил вот в этой теме.
Попробуйте еще раз, если не получится - отпишите, я подскажу. | |
|
|
|
|
|
|
|
для: Trianon
(12.04.2010 в 20:35)
| | Запрос получился Спасибо за помощь
SELECT `s`.`url`, `c`.`url`, `i`.`title`
FROM (
SELECT `id_cat` , MAX( `id` ) AS `id_mi`
FROM `img`
GROUP BY `id_cat`
) AS `t`
JOIN `categories` AS `c` ON `c`.`id` = `t`.`id_cat`
LEFT JOIN `categories` AS `s` ON `s`.`id` = `c`.`p_id`
JOIN `img` AS `i` ON `i`.`id` = `t`.`id_mi`
|
url url title
girls celebrities Roselyn Sanchez
girls models Petra Nemcova
girls beauties Stacy Keibler
cars sports Black Sports Car
cars 4x4 GMC Canyon Crew
|
но совершенно не нравится строчка в эксплайне
id select_type table type possible_keys key key_len ref rows Extra
2 DERIVED img ALL NULL NULL NULL NULL 127 Using temporary; Using filesort
|
Всё таки хочется избавиться совсем от GROUP BY
типа
SELECT max( id ) FROM `img` WHERE `id_cat` =10 [`categories`.`id`]
..............................
SELECT max( id ) FROM `img` WHERE `id_cat` =11 [`categories`.`id`]
|
где ref --> const | |
|
|
|
|
|
|
|
для: oliss
(13.04.2010 в 03:46)
| | Получился вариант запроса без GROUP BY
SELECT `s`.`url` , `i`.`title`
FROM (
SELECT (
SELECT MAX( `id` )
FROM `img`
WHERE `id_cat` = `c`.`id`
) AS t
FROM `categories` AS `c`
WHERE `c`.`p_id` !=0
) AS zz
JOIN `img` AS `i` ON `i`.`id` = `zz`.`t`
LEFT JOIN `categories` AS `s` ON `s`.`id` = `id_cat`
url title
celebrities Roselyn Sanchez
models Petra Nemcova
beauties Stacy Keibler
sports Black Sports Car
4x4 GMC Canyon Crew
|
Чуть лучше первого ,но всё-же мне не нравится
Trianon ,может что-то посоветуете, в какую сторону глядеть ,чтобы избавиться от MAX( `id` ) там идет сканирование всех записей для каждой категории ( а их много , в смысле записей ) | |
|
|
|
|
|
|
|
для: oliss
(13.04.2010 в 07:01)
| | Если добавление фотографий идет существенно реже просмотра (а удаление их - еще реже) - записывайте id последней фотографии в свойства категории.
И что такое "много записей"? | |
|
|
|
|
|
|
|
для: Trianon
(13.04.2010 в 09:13)
| | Да тоже была такая мысль ставить метку последней добавленной более 50 тыс на категорию | |
|
|
|
|
|
|
|
для: oliss
(13.04.2010 в 13:23)
| | Так . погодите-ка.
А составной индекс id_cat, id на таблице img Вы делать не пробовали? | |
|
|
|
|
|
|
|
для: Trianon
(13.04.2010 в 13:39)
| | А как его сделать?
делаю
ALTER TABLE `img` ADD INDEX ( `id`,`id_cat`)
получаю
PRIMARY KEY (`id`),
KEY `id` (`id`,`id_cat`),
а вроде должно быть
PRIMARY KEY (`id`),
KEY (`id`,`id_cat`),
|
| |
|
|
|
|
|
|
|
для: oliss
(14.04.2010 в 09:09)
| |
ALTER TABLE `img` DROP KEY `id`;
ALTER TABLE `img` ADD UNIQUE KEY `id_cat__id` ( `id_cat`,`id`);
|
Последовательность полей в индексе важна не меньше, чем их множество. | |
|
|
|
|