Здравствуйте! Подскажите пожалуйста, есть такая проблемка.. Пусть есть 2 таблицы: одна для страниц - pages (id, title, info), другая для фотографий прикрепленных к старницам - foto (id, filename, npp, id_pages). А атрибут foto.id_pages - внешний идентификатор от pages.id. foto.npp - порядковый номер фотографии относительно других фотографий конкретной страницы. Таким образом пример содержимого таблиц такой: pages Код (Text): id title info 1 Новость1 текст1 2 Новость2 текст2 foto Код (Text): id filename id_pages npp 1 abc.jpg 1 2 2 def.jpg 1 3 3 ghi.jpg 1 1 4 vxv.jpg 2 1 А задачка такая - надо выводить из бд запись о странице pages и название файла первой фотографии по foto.npp. Делаю выборку страниц (например для списка новостей): Код (Text): SELECT pages.*, foto.filename FROM pages INNER JOIN foto ON foto.id_pages=pages.id GROUP BY pages.id ORDER BY pages.id desc, foto.npp ASC И почему-то для первой страницы фотку выдает все равно с foto.id=1 и foto.npp=2, т.е. первую по идентификатору..А должен же с foto.npp=1 ! Cортировку по npp игнорирует :-( Хотя если убрать group by, то список вывода будет правильным - отсортированным по foto.npp. Подскажите пожалуйста в чем моя ошибка? Может какие то нюансы SQL здесь надо знать?.. Заранее спасибо!
Спасибо за Ваш отклик.. Хм.. но у меня то результаты другие.. Может ли быть это связано с настройками MySQL или там версией? Или может это только глюк локального сервера...
Какие "другие"? Добавлено спустя 20 секунд: При группировке нельзя указывать любые поля для вывода, можно только те по которым группируете + агрегатные функции от других полей. а указывать * в запросе GROUP BY это просто свальный грех! То что при некоторых настройках MySQL позволяет вам такие вольности не гарантирует ошибок в будущем. Будте строже и ошибок не будет. Например, вот такой запрос правильный и выдаст предсказуемый результат: Код (Text): SELECT `id_pages`, MIN(`npp`) AS `npp` FROM `foto` GROUP BY `id_pages` Но если вы тупо добавите сюда поле filename, то это уже будет неправильный непредсказуемый запрос. Выкрутиться из положения можно если указанный запрос оформить как под-запрос. Код (Text): SELECT `pages`.*, `foto`.* FROM ( SELECT `id_pages`, MIN(`npp`) AS `npp` FROM `foto` GROUP BY `id_pages` ) AS `ff` INNER JOIN `foto` ON `ff`.`id_pages`=`foto`.`id_pages` AND `ff`.`npp`=`foto`.`npp` RIGHT JOIN `pages` ON `pages`.`id`=`ff`.id_pages Здесь я предполагаю, что у некоторых страниц может не быть фото, тогда соответствующие поля будут выведены пустыми. Добавлено спустя 2 минуты 37 секунд: http://sqlfiddle.com/#!2/00bc1/1
Другие - выводит первым с foto.id=1... Походу стоящие у меня раньше настройки MySQL позволяли это делать. Сейчас же вот нет. В принципе я Вас понял. Спасибо за советы.. Я тоже находил подобное решение с под-запросом, но подумал, что использовать под-запросы не оптимально, хотя мой запрос был более громоздкий, чем Ваш Буду пробовать тогда с подзапросами.. возьму на вооружение. Спасибо!)
На здоровье. Кто сомневается в эффективности, может на sqlfiddle кликнуть ссылку View Execution Plan.