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

Форум MySQL

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

 

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

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

тема: Выборка по двум таблицам
 
 автор: oliss   (12.04.2010 в 10:28)   письмо автору
 
 

таб 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

  Ответить  
 
 автор: Trianon   (12.04.2010 в 11:15)   письмо автору
 
   для: 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) должно давать последний ключ.

  Ответить  
 
 автор: oliss   (12.04.2010 в 17:20)   письмо автору
 
   для: 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');

  Ответить  
 
 автор: Trianon   (12.04.2010 в 20:35)   письмо автору
 
   для: oliss   (12.04.2010 в 17:20)
 

И я так понял, сложный запрос составить не получилось?
Кое-какие комментарии в схожей ситуации я изложил вот в этой теме.
Попробуйте еще раз, если не получится - отпишите, я подскажу.

  Ответить  
 
 автор: oliss   (13.04.2010 в 03:46)   письмо автору
 
   для: 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 в 07:01)   письмо автору
 
   для: 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` ) там идет сканирование всех записей для каждой категории ( а их много , в смысле записей )

  Ответить  
 
 автор: Trianon   (13.04.2010 в 09:13)   письмо автору
 
   для: oliss   (13.04.2010 в 07:01)
 

Если добавление фотографий идет существенно реже просмотра (а удаление их - еще реже) - записывайте id последней фотографии в свойства категории.
И что такое "много записей"?

  Ответить  
 
 автор: oliss   (13.04.2010 в 13:23)   письмо автору
 
   для: Trianon   (13.04.2010 в 09:13)
 

Да тоже была такая мысль ставить метку последней добавленной более 50 тыс на категорию

  Ответить  
 
 автор: Trianon   (13.04.2010 в 13:39)   письмо автору
 
   для: oliss   (13.04.2010 в 13:23)
 

Так . погодите-ка.
А составной индекс id_cat, id на таблице img Вы делать не пробовали?

  Ответить  
 
 автор: oliss   (14.04.2010 в 09:09)   письмо автору
 
   для: 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`),

  Ответить  
 
 автор: Trianon   (14.04.2010 в 09:25)   письмо автору
 
   для: oliss   (14.04.2010 в 09:09)
 

ALTER TABLE `img` DROP KEY `id`;

ALTER TABLE `img` ADD UNIQUE KEY `id_cat__id` ( `id_cat`,`id`);


Последовательность полей в индексе важна не меньше, чем их множество.

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

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