Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день.
Есть таблица организаций, в ней есть 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 вариантов решения в один запрос.
Неактивен
http://sqlinfo.ru/forum/viewtopic.php?id=1742
Смотреть всю тему до конца.
Неактивен
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
, но почему-то условие не срабатывает как хотелось бы, в чем может быть причина?
И вообще в техническом форуме неприлично про оргии говорить :-)
Неактивен
прочитал тему, а ситуация не изменилась...
Неактивен
Изначально в таблице данные в произвольном порядке. А вам нужно, чтобы они были отсортированы по категориям и рейтингу.
Неактивен
vasya, спасибо большое, сортировку как оказалось не там указывал
Неактивен
А помогите и мне с изменением запроса
$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.
Неактивен
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;
Неактивен
Спасибо. Но вот ошибка выскакивает.
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
Неактивен
1. Это два запроса, а вы пытаетесь выполнить их как один. Наверное с использованием mysql_query(), которая не поддерживает несколько команд в одном запросе.
Для выполнения нескольких запросов одновременно можно использовать mysqli_multi_query().
2. Вы уверены, что вам вообще нужен этот запрос? Какой смысл всех этих извращений, если в конце запрорса вы пишите LIMIT ?
Неактивен
2. Нет, не уверен. Возможно стоит сделать 5 запросов вместо одного (категорий - 5)?
Я выше дал запрос из движка, который надо изменить. Движок выбирает все новости из категорий в куче, а я хочу по 10 из каждой. Затем я данные рассортирую по блокам. Лимит может даже лишний. Я тоже подумал о нем. Ведь и так ограничиваем @i<@n
1. Вы правы я 2 запроса закинул под одну функцию. Видно надо выполнять 2 функции по отдельности. Сделал так. Ошибки нет. Но при этом выбирает не пойми что...Новости за апрель того года. При этом запрос вызвал большую нагрузку на сервак. Поэтому буду пока тестить на денвере.
Неактивен
Вероятно, будет проще сделать 5 запросов.
Upd: Вновых версиях где есть поддержка lateral гарантированно будет быстрее одним запросом, см 6-ой способ из Выбрать несколько последних записей в каждой группе.
Неактивен