Помогите разобраться с mysql-запросом
4 сообщения
#14 лет назад
Не могу понять как лучше сделать такой запрос.Имеется таблица товаров. Например:
id date ownerid
Нужно получить 10 последних добавленных в каталог товаров, по одному от каждого магазина (ownerid)
По такому запросу:
SELECT * FROM table WHERE 1 GROUP BY ownerid ORDER by date DESC LIMIT 10
получаю только первые товары 10-ти последних магазинов.
4 сообщения
#14 лет назад
Цитата ("elosoft"):GROUP BY работает только вместе с ORDER by.
А как лучше сделать тогда?
2989 сообщений
#14 лет назад
Ну если из одной таблицы то например такSELECT * FROM table WHERE 1 GROUP BY ownerid ORDER by ownerid desc, date DESC LIMIT 10
Причем индекс ownerid в ORDER by обязательно должен быть первым
4 сообщения
#14 лет назад
Цитата ("elosoft"):Ну если из одной таблицы то например так
SELECT * FROM table WHERE 1 GROUP BY ownerid ORDER by ownerid desc, date DESC LIMIT 10
Причем индекс ownerid в ORDER by обязательно должен быть первым
Не получается. Также выводятся только первые товары от каждого магазина. А нужно выводить последние.
Предполагаю, что при группировке берется первая встретившаяся запись и эти первые записи потом сортируются по дате.
2989 сообщений
#14 лет назад
Ну первые не могут выводиться. У Вас стоит date DESC, так что первым в списке будет последний по дате. Проверьте, что-то есть не так.А группировка в mysql работает так: группой считается не прерывающаяся цепь значения параметра указанного в GROUP BY без сохранения значения.
Пример
--новая группа
1
1
1
--новая группа
2
2
--новая группа
3
--новая группа
1
1
--новая группа
2
--новая группа
7
и т.д.
1599 сообщений
#14 лет назад
Цитата ("elosoft"):GROUP BY работает только вместе с ORDER by.
чо? смысли я не могу написать это?!
SELECT name FROM table GROUP BY name;
2 сообщения
#14 лет назад
Цитата ("elosoft"):А группировка в mysql работает так: группой считается не прерывающаяся цепь значения параметра указанного в GROUP BY без сохранения значения.
Это как ?
1599 сообщений
#14 лет назад
Цитата ("yusupov"):SELECT * FROM table WHERE 1 GROUP BY ownerid ORDER by date DESC LIMIT 10
получаю только первые товары 10-ти последних магазинов.
Естественно. Мускул сначала группирует (т.е. вынимается одна запись всех магазинов, в данном случае первая, самая ранняя - хотя это как бох на душу положит, точнее мускулу захочется), а ПОТОМ уже сортирует полученное - естественно в начале оказываются 10 последних магазов со своими первыми записями). Как помочь с запросом чо та не соображу слету, если чо придумаю, отпишусь) ваще копайте в сторону HAVING и всяких групповых функций..
elosoft, я с тебя уже который раз фигею. Ты просто дикая невежда.. Это ж надо столько чуши нанести в одном топике :o
771 сообщение
1599 сообщений
#14 лет назад
Цитата ("filipchuk"):Это можно сделать с помощью, например, под-запроса
дак интересно сделать без него

Цитата ("franky"):
а так?
а так вывалится список, отсортированный по юзерам - т.е. 10 строк первого юзера, 20 строк второго и т.д. - и они-то каждые в своей "группе" уже будут отсортированы по дате. И чего с ними делать?
2989 сообщений
#14 лет назад
Цитата ("Paralysed"):я с тебя уже который раз фигею. Ты просто дикая невежда..
Фигеть не стоит, достаточно научиться читать. И стоит следить за своим языком, это тоже не вредно абсолютно всем.
И почитайте как работает GROUP BY. Может я и неудачно написал, но GROUP BY никак не управляет собственно запросом. Просто из полученной выборки все строки идущие подряд с одним значеним параметра GROUP BY считаются группой и отдается только первая строка этой группы.
1599 сообщений
#14 лет назад
Цитата ("elosoft"):Ну первые не могут выводиться. У Вас стоит date DESC, так что первым в списке будет последний по дате.
О чем может быть разговор, если ты считаешь, что order by как-то влияет на group by? Это неудачно? Да это epic fail!
Цитата ("elosoft"):
И почитайте как работает GROUP BY. Может я и неудачно написал, но GROUP BY никак не управляет собственно запросом. Просто из полученной выборки все строки идущие подряд с одним значеним параметра GROUP BY считаются группой и отдается только первая строка этой группы.
Я читал, английскую документацию mysql. А ты что? Еще раз - хватит продолжать нести чушь! SQL вообще не разрешает такой вариант group by, это мускул просто такое толерантный - но запрос неверный в принципе. Первая строка этой группы

4 сообщения
#14 лет назад
Всем спасибо огромное!Помогло такое решение:
SELECT * FROM (SELECT * FROM table ORDER BY date DESC) as t WHERE 1 GROUP BY ownerid ORDER by date DESC LIMIT 10
3240 сообщений
#14 лет назад
yusupov, Для правильного решения мало информации, нужно уточнение:1. Как генерируется поле id? Это автоинкремент?
2. Всегда ли верно, что date > date? То есть всегда ли дата следующего добавленного в базу данных товара всегда больше даты любого добавленного ранее? Может ли дата быть изменена впоследствии оператором (админом, юзером и т.д.)?
3. Является ли поле date уникальным? Могут ли в Вашей базе данных существовать одновременно несколько товаров, имеющих одно и то же значение даты? То есть, возможно ли date == date?
В зависимости от Вашего ответа будут совершенно разные решения.
3240 сообщений
#14 лет назад
Допустим, есть следующие условия, наиболее приближенные к реальности:1. Поле id является автоинкрементным.
2. Значение поля data не зависит от порядка добавления в базу данных, например могут быть добавлены товары задним числом.
3. Поле data не является уникальным, возможно множество товаров с одной и той же датой.
4. Владельцев может быть и более 10, но вывести нужно только по одному товару первых 10 владельцев, по убыванию даты.
Тогда SQL запрос может быть таким:
SELECT MAX(a.id) AS id, a.ownerid, a.date
FROM mytable a, (SELECT ownerid, MAX(date) AS date FROM mytable GROUP BY ownerid ORDER BY date DESC LIMIT 10) b
WHERE a.ownerid = b.ownerid AND a.date = b.date
GROUP BY a.ownerid
ORDER BY date DESC, id DESC
182 сообщения
#14 лет назад
Добрый день, мои знания mysql примитивные, поэтому не знаю всех его возможностей, хотел просто спросить можно ли реализовать следующее одни запросомСейчас запрос такой:
SELECT login FROM mytable ORDER BY id DESC LIMIT 0, 10
вопрос: можно ли сделать, чтобы значения login не повторялись? Т.е. в запросе исключить повторения?
584 сообщения
#14 лет назад
Цитата ("Stan-87"):вопрос: можно ли сделать, чтобы значения login не повторялись? Т.е. в запросе исключить повторения?
SELECT DISTINCT login FROM mytable ORDER BY id DESC LIMIT 0, 10