Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сортировка по подчиненной таблице и group by, помогите с запросом 
V
    Опции темы
sanich_
Дата 26.1.2010, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



Здравствуйте!

Есть таблица trening и trening_files отношение между ними 1 ко многим
в таблице trening_files есть поле checked по которому нужно отсортировать
Вот что пробовал:

Код

SELECT t.id_trening,f.checked FROM trening t, trening_files f
where t.id_trening = f.id_trening
ORDER BY f.checked desc


id_trening  checked
4    no
2    no
2    no
3    no
1    yes
4    yes
3    yes
2    yes
1    yes
5    yes

В результате в поле id_trening есть дублирующие записи, дубликаты нужно убрать, сотрировка верно работает, из скрина видно, что если подавить дубликаты id_trening, то в поле id_trening числа должны стоять имеенно в такой последовательности и это то, что мне нужно

id_trening
4                 
2
3
1
5

Убираю дубликаты с помощью group by
Код

SELECT t.id_trening,f.checked FROM trening t, trening_files f
where t.id_trening = f.id_trening
group by t.id_trening ORDER BY f.checked desc


Получаю результат не в той последовательности, что есть неправильно

id_trening  checked
2    no
3    yes
4    yes
5    yes
1    yes

PM MAIL   Вверх
sir_nuf_nuf
Дата 26.1.2010, 13:11 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 8
Всего: 31



Попробуйте так:
Код

SELECT t.id_trening, max(IF(f.checked == 'yes',1,0)) as has_checked
FROM trening t, trening_files f
WHERE t.id_trening = f.id_trening
GROUP BY t.id_trening
ORDER BY has_checked DESC;



--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Akina
Дата 26.1.2010, 13:35 (ссылка) |  (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Неправильный запрос, дающий правильный результат:
Цитата

mysql> create table test(
    -> id integer,
    -> txt text
    -> );
Query OK, 0 rows affected (0.09 sec)

mysql> insert into test values (4,'no');
Query OK, 1 row affected (0.05 sec)

mysql> insert into test values (2,'no');
Query OK, 1 row affected (0.03 sec)

mysql> insert into test values (2,'no');
Query OK, 1 row affected (0.02 sec)

mysql> insert into test values (3,'no');
Query OK, 1 row affected (0.03 sec)

mysql> insert into test values (1,'yes');
Query OK, 1 row affected (0.20 sec)

mysql> insert into test values (4,'yes');
Query OK, 1 row affected (0.14 sec)

mysql> insert into test values (3,'yes');
Query OK, 1 row affected (0.03 sec)

mysql> insert into test values (2,'yes');
Query OK, 1 row affected (0.03 sec)

mysql> insert into test values (1,'yes');
Query OK, 1 row affected (0.55 sec)

mysql> insert into test values (5,'yes');
Query OK, 1 row affected (0.02 sec)

mysql> select * from test;
+------+------+
| id   | txt  |
+------+------+
|    4 | no   |
|    2 | no   |
|    2 | no   |
|    3 | no   |
|    1 | yes  |
|    4 | yes  |
|    3 | yes  |
|    2 | yes  |
|    1 | yes  |
|    5 | yes  |
+------+------+
10 rows in set (0.00 sec)

mysql> select * from (
    -> select * from test where txt='no'
    -> union
    -> select * from test where txt='yes'
    -> ) x group by x.id order by txt;
+------+------+
| id   | txt  |
+------+------+
|    4 | no   |
|    2 | no   |
|    3 | no   |
|    1 | yes  |
|    5 | yes  |
+------+------+
5 rows in set (0.00 sec)

mysql>
Товарищ что-то недоговаривает...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
sanich_
Дата 26.1.2010, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



Сори, наверно не очень толково объяснил задачу. Все, что привели не совсем верно.

Скажем так, есть таблица "trening_files",в ней два поля с данными 

id_trening  checked
1                no
1                yes
2                yes
2                no
2                no
3                yes
3                no
4                no
4                no
5                yes

"id_trening" - это внешний ключ, на запись тренинга поэтому повторяется
"checked" - это статус проверки файла ('yes','no') ('проверенный', 'непроверенный')
У каждого тренинга множество файлов, у которых разные статусы "checked"
Задача вывести тренинги (id_trening) в таком порядке, чтобы вверху были те тренинги, в которых в файлах статус "checked" равен 'no', т.е. непроверенные файлы, а после уже проверенные, причем чем больше у тренинга непроверенных файлов, тем выше должен быть тренинг

т.е. исходя из табличных данных приведенных выше, последовательность тренингов должна получится следующая
id_trening
4
2
3
1
5

или

id_trening
2
4
3
1
5

потому как у 
id_trening=2 2 файла со статусом 'no'
id_trening=4 2 файла со статусом 'no'


PM MAIL   Вверх
Akina
Дата 26.1.2010, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Тогда идея sir_nuf_nuf абсолютно верная. Только вместо Max надо считать Sum и сортировать именно по сумме.

Добавлено через 57 секунд
Вернее, по Sum(IF(f.checked == 'yes',0,1))


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
sanich_
Дата 26.1.2010, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



Цитата(Akina @ 26.1.2010,  22:57)
Тогда идея sir_nuf_nuf абсолютно верная. Только вместо Max надо считать Sum и сортировать именно по сумме.

Добавлено @ 22:57
Вернее, по Sum(IF(f.checked == 'yes',0,1))

да, точно спасибо, вот так еще короче

Код

SELECT t.id_trening,sum('no' = f.checked) AS cnt_checked FROM trening t, trening_files f
where t.id_trening = f.id_trening
group by t.id_trening ORDER BY cnt_checked desc

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0742 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.