Как правильно составить запрос

Self Author

Новичок
Как правильно составить запрос

Помогите пожалуйста, что-то я туплю (или знаний не хватает).
Нужно сделать такой запрос к таблице MySQL:

Есть таблица:
1. id_object - целое
2. id_subject - строка
3. rank - enum(-2,-1,0,1,2).

Сначала мне нужно сделать запрос: получить всех субъектов, для которых задан объект, и ранк = 2.
Получил этот список.
Потом надо получить список всех объектвов, где эти полученные субъекты поставили ранк = 2, причём отсортировать эти объекты так, чтобы вначале были те, для которых большее количество субъектов из этого списка поставили ранк = 2.
Получается, если я сделаю второй запрос так:
SELECT `id_object`FROM `Table`WHERE (`id_subject` = 'aaa' OR `id_subject` = 'bbb') AND `rank` = 2
То я не узнаю, сколько этих ИЛИ сработало для одной результирующей строки.

Вот такая проблема...
 

Gas

может по одной?
[sql]
select id_object, count(id_object) as cnt, group_concat(id_subject) as subjects from tbl
where id_subject != '' and rank = 2
group by id_object
Orber by cnt desc
[/sql]
group_concat работает начиная с mysql 4.1
 

Kane

Новичок
Автор оригинала: Gas
[sql]
select id_object, count(id_object) as cnt, group_concat(id_subject) as subjects from tbl
where id_subject != '' and rank = 2
group by id_object
Orber by cnt desc
[/sql]
group_concat работает начиная с mysql 4.1
select id_object, count(id_object) as cnt, MAX(id_subject) as subjects from tbl
where subjects != '' and rank = 2
group by id_object
Orber by cnt desc
Может сработать и в 3.* (не уверен)
 

Self Author

Новичок
В том, что сказал Gas не разбирался, т.к. версия мускула - 3.23. А вот вариант Kane посмотрел...
Задача в другом. Прошу прощения, что наверно непонятно объяснил.
Дано: id_object. (к примеру, 100)
Задача состоит из двух этапов:
1. Найти все id_subject в которых для заданного id_object rank =2
Первая часть решается простым запросом:
[SQL]SELECT `id_subject` FROM `tbl` WHERE `id_object` = 100 AND `rank` = 2[/SQL]

2. Найти все id_object, в которых rank =2 И id_subject находится среди списка, полученном в первой части задачи.
Т.е., предположим, что я получил результатом первого запроса такие значения:
'aaa', 'bbb', 'ccc', 'ddd'.
Тогда я бы мог сгенерировать такой запрос:
[SQL]SELECT `id_object` FROM `tbl` WHERE (`id_subject` = 'aaa' OR `id_subject` = 'bbb' OR `id_subject` = 'ccc' OR `id_subject` = 'ddd') AND `rank` = 2[/SQL]
И всё было бы замечательно, даже не смотря на то, что количество результатов первого запроса может доходить до 500 (это значит что мне придётся делать 500 "OR"). А проблема в том, что мне крайне важно отсортировать результаты второго запроса по количеству истинных условий среди этого списка 'OR'. Т.е., например есть некий id_object, для которого есть строки со всеми вариантами id_subject и rank=2. И он должен стоять на первом месте, а тот id_object, для которого есть только строчка с одним из вариантов id_subject, должен стоять на последнем месте.

Вот. Не знаю, понятно объяснил или нет...

-~{}~ 11.02.06 12:09:

... называется "принцип болванчика": пока сам объяснял, что-то в мозгах просветлилось.
[SQL]SELECT b.id_object, COUNT(b.id_subject) AS cnt FROM `tbl` AS a, `tbl` AS b WHERE a.id_object = 100 AND a.rank = 2 AND a.id_subject = b.id_subject AND b.rank = 2 GROUP BY b.id_object ORDER BY cnt DESC[/SQL]
Вот, кажется так.
Прошу прощения за беспокойство.
 
Сверху