alhames.ru
Имеется две таблицы:
и
Где `foto`.`parent` = `news`.`id`. Отношение новость <-> фото - один ко многим.
Имеется запрос:
Задача, выбрать для каждой новости первое фото по полю `sort`. Но ORDER BY F.`sort` ASC не работает совершенно до тех пор пока в запросе есть GROUP BY
Есть ли возможность не разделяя запрос как-то заставить сортировать фото?
news | |||
---|---|---|---|
id | title | content | date |
и
foto | |||
---|---|---|---|
id | parent | file | sort |
Где `foto`.`parent` = `news`.`id`. Отношение новость <-> фото - один ко многим.
Имеется запрос:
SELECT N.*, F.`file`
FROM `news` AS N
LEFT JOIN `foto` AS F ON (F.`parent` = N.`id`)
GROUP BY N.`id`
ORDER BY N.`date` DESC, F.`sort` ASC
LIMIT 10
FROM `news` AS N
LEFT JOIN `foto` AS F ON (F.`parent` = N.`id`)
GROUP BY N.`id`
ORDER BY N.`date` DESC, F.`sort` ASC
LIMIT 10
Задача, выбрать для каждой новости первое фото по полю `sort`. Но ORDER BY F.`sort` ASC не работает совершенно до тех пор пока в запросе есть GROUP BY
Есть ли возможность не разделяя запрос как-то заставить сортировать фото?
ИМХО лучшим вариантом будет добавить в таблицу foto ещё одно поле - main, булево. При добавлении/редактировании фотографий нужно просто проследить, чтобы у одной из фотографий конкретной новости main = 1, у остальных 0. Тогда все проще простого:
WHERE f.main = '1'
Но тогда новости без фоток выбираться не будут (у меня LEFT JOIN ведь).
Разве что засунуть его в ON.. Но проблема в том, что расширять таблицу - не самое лучшее решение, т.к. еще и скрипты сортировки / добавления фото придется подстраивать..
Но мысль понял, спасибо
Ситуация примерно такая же, только вместо news - item, а вместо foto - itemimage.
select t.*, SUBSTRING(MIN(CONCAT(RPAD(p.Position,6,' '), image)),7) as Image
from item t left outer join itemimage p on t.id = p.itemId
group by t.id
Соответственно твой вариант будет что-то вроде такого
SELECT N.*, SUBSTRING(MIN(CONCAT(RPAD(F.sort,6,' '), file)),7) as file
FROM `news` AS N
LEFT JOIN `foto` AS F ON (F.`parent` = N.`id`)
GROUP BY N.`id`
ORDER BY N.`date` DESC
LIMIT 10
OMG greatshot :-) :-) :-) !