Булат Ю.
4 сообщения
#14 лет назад
Не могу понять как лучше сделать такой запрос.
Имеется таблица товаров. Например:

id date ownerid

Нужно получить 10 последних добавленных в каталог товаров, по одному от каждого магазина (ownerid)

По такому запросу:

SELECT * FROM table WHERE 1 GROUP BY ownerid ORDER by date DESC LIMIT 10

получаю только первые товары 10-ти последних магазинов.
Евгений О.
2989 сообщений
#14 лет назад
GROUP BY работает только вместе с ORDER by.
Булат Ю.
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
Сергей Ф.
83 сообщения
#14 лет назад
Это можно сделать с помощью, например, под-запроса
Дмитрий О.
771 сообщение
#14 лет назад
Цитата ("yusupov"):
SELECT * FROM table ORDER by ownerid, date DESC LIMIT 10

а так?
Роман П.
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, это мускул просто такое толерантный - но запрос неверный в принципе. Первая строка этой группы это где в mysql первая или последняя строка? Первая строка может быть только после применения order 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
Виктор Т.
1036 сообщений
#14 лет назад
SELECT DISTINCT login FROM mytable ORDER BY id DESC LIMIT 0, 10


Оффтопик
Опередили