SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 09.08.2011 10:59:45

jewer
Участник
Зарегистрирован: 09.08.2011
Сообщений: 3

Выборка нескольких последних записей в неких группах

Добрый день.

Есть таблица организаций, в ней есть 2 поля которые нужны для выборки, это категория орг-ии и рейтинг.
Задача выбрать из каждой категории по 3 организации с наивысшим рейтингом. Гугл примерный вопрос нашёл

select * from
(
select t1.*,
if(@cat=category,
@rownum:=@rownum+1,
@rownum:=1+least(0,@cat:=category)) rown
from table t1, (select @rownum:=1, @cat:=0) zz
order by t1.category, t1.rating DESC
) yy
where rown < 4

, но почему-то условие не срабатывает как хотелось бы, в чем может быть причина?


Комментарий модератора.
См Выборка последних записей в группах
В этой статье приведено 6 вариантов решения в один запрос.

Неактивен

 

#2 09.08.2011 14:36:05

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выборка нескольких последних записей в неких группах

http://sqlinfo.ru/forum/viewtopic.php?id=1742
Смотреть всю тему до конца.

Неактивен

 

#3 09.08.2011 15:23:50

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Выборка нескольких последних записей в неких группах

jewer написал:

Добрый день.

Есть таблица организаций, в ней есть 2 поля которые нужны для выборки, это категория орг-ии и рейтинг.
Задача выбрать из каждой категории по 3 организации с наивысшим рейтингом. Гугл примерный вопрос нашёл

select * from
(
select t1.*,
if(@cat=category,
@rownum:=@rownum+1,
@rownum:=1+least(0,@cat:=category)) rown
from table t1, (select @rownum:=1, @cat:=0) zz
order by t1.category, t1.rating DESC
) yy
where rown < 4

, но почему-то условие не срабатывает как хотелось бы, в чем может быть причина?

И вообще в техническом форуме неприлично про оргии говорить :-)

Неактивен

 

#4 09.08.2011 16:10:53

jewer
Участник
Зарегистрирован: 09.08.2011
Сообщений: 3

Re: Выборка нескольких последних записей в неких группах

прочитал тему, а ситуация не изменилась...



set @n=4, @i=0, @p=0;
select t1.* from table t1 where if(@p=t1.category, @i:=@i+1,(@i:=0) or (@p:=t1.category)) and  @i<@n order by t1.category, t1.rating  DESC;
 



все равно в условии попадает на
(@i:=0) or (@p:=t1.category)
... категория чтоли переменноё не присвается... даже не знаю...

Неактивен

 

#5 09.08.2011 17:16:24

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выборка нескольких последних записей в неких группах

Изначально в таблице данные в произвольном порядке. А вам нужно, чтобы они были отсортированы по категориям и рейтингу.

select t1.* from (select * from `table` order by category, rating  DESC)  t1 where if(@p=t1.category, @i:=@i+1,(@i:=0) or (@p:=t1.category)) and  @i<@n;

Неактивен

 

#6 09.08.2011 17:23:17

jewer
Участник
Зарегистрирован: 09.08.2011
Сообщений: 3

Re: Выборка нескольких последних записей в неких группах

vasya, спасибо большое, сортировку как оказалось не там указывал

Неактивен

 

#7 17.08.2011 16:08:20

Aqula
Участник
Зарегистрирован: 12.01.2011
Сообщений: 21

Re: Выборка нескольких последних записей в неких группах

А помогите и мне с изменением запроса

$where_date = " AND date < '" . $thisdate . "'";
$where_category = "category IN ('" . $custom_category . "')";
$stop_list = "category IN ('" . implode( "','", $allow_list ) . "') AND ";


$sql_select = "SELECT id, autor, date, short_story, full_story, xfields, title, category, alt_name, comm_num, allow_comm, allow_rate, rating, vote_num, news_read, flag, editdate, editor, reason, view_edit, tags FROM " . PREFIX . "_post WHERE " . $stop_list . $where_category . " AND approve" . $where_date . " ORDER BY " . $news_sort . " " . $news_msort . " LIMIT " . $custom_from . "," . $custom_limit;

Хочу выдачу по 10 новостей из категорий a,b,c. Затем я буду расфасовывать их по блокам A,B,C.

Неактивен

 

#8 17.08.2011 16:20:42

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выборка нескольких последних записей в неких группах

select t1.* from ( ваш запрос до сортировки order by category)  t1 where if(@p=t1.category, @i:=@i+1,(@i:=0) or (@p:=t1.category)) and  @i<@n ORDER BY " . $news_sort . " " . $news_msort . " LIMIT " . $custom_from . "," . $custom_limit;

Неактивен

 

#9 18.08.2011 23:40:11

Aqula
Участник
Зарегистрирован: 12.01.2011
Сообщений: 21

Re: Выборка нескольких последних записей в неких группах

Спасибо. Но вот ошибка выскакивает.
MySQL Error!
------------------------

The Error returned was:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT t1.* from ( SELECT id, autor, date, short_story, full_story, xfields, tit' at line 1

Error Number:
1064
Запрос получился:
SET @n=10, @i=0, @p=0; SELECT t1.* from ( SELECT id, autor, date, short_story, full_story, xfields, title, category, alt_name, comm_num, allow_comm, allow_rate, rating, vote_num, news_read, flag, editdate, editor, reason, view_edit, tags FROM tab_post WHERE category IN ('1','2','3') AND approve ORDER BY category ) t1 where if(@p=t1.category, @i:=@i+1,(@i:=0) or (@p:=t1.category)) and  @i<@n ORDER BY date DESC LIMIT 0,10

Неактивен

 

#10 19.08.2011 01:28:41

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выборка нескольких последних записей в неких группах

1. Это два запроса, а вы пытаетесь выполнить их как один. Наверное с использованием mysql_query(), которая не поддерживает несколько команд в одном запросе.
Для выполнения нескольких запросов одновременно можно использовать mysqli_multi_query().

2. Вы уверены, что вам вообще нужен этот запрос? Какой смысл всех этих извращений, если в конце запрорса вы пишите LIMIT ?

Неактивен

 

#11 19.08.2011 11:24:33

Aqula
Участник
Зарегистрирован: 12.01.2011
Сообщений: 21

Re: Выборка нескольких последних записей в неких группах

2. Нет, не уверен.smile Возможно стоит сделать 5 запросов вместо одного (категорий - 5)?
Я выше дал запрос из движка, который надо изменить. Движок выбирает все новости из категорий в куче, а я хочу по 10 из каждой. Затем я данные рассортирую по блокам. Лимит может даже лишний. Я тоже подумал о нем. Ведь и так ограничиваем @i<@n

1. Вы правы я 2 запроса закинул под одну функцию. Видно надо выполнять 2 функции по отдельности. Сделал так. Ошибки нет. Но при этом выбирает не пойми что...Новости за апрель того года. При этом запрос вызвал большую нагрузку на сервак. Поэтому буду пока тестить на денвере.

Неактивен

 

#12 19.08.2011 11:39:02

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Выборка нескольких последних записей в неких группах

Вероятно, будет проще сделать 5 запросов.

Upd: Вновых версиях где есть поддержка lateral гарантированно будет быстрее одним запросом, см 6-ой способ из Выбрать несколько последних записей в каждой группе.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson