Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Каждой твари по паре
 
 автор: Eugene77   (13.04.2012 в 19:03)   письмо автору
 
 

В большой таблице лежат оценки (double), данные разными тестерами (int)
Мне надо получить маленькую таблицу, в которой сведены равные количества лучших оценок каждого из тестеров.

Это только на РНР писать или MySQL тоже так может?

Таблица вполне очевидного формата:

id INT - просто первичный ключ
mark double - оценка
testerNumber INT - номер тестера

Соответственно, тестер с номером 1 может присутствовать в таблице в 100 раз большем количестве, чем тестер с номером 2.
В результирующей таблице должно быть строго определённое количество строк, и насколько только возможно, выровненное количество тестеров. (Если невозможно достигнуть равенства, -оценок кого-то из тестеров не хватает, тогда дополняем оченками остальных в равной мере (сохраняя равенство хотя бы между ними).

  Ответить  
 
 автор: cheops   (14.04.2012 в 17:00)   письмо автору
 
   для: Eugene77   (13.04.2012 в 19:03)
 

Это вполне можно решить и средствами MySQL. Главное добиться нужного вам вывода при помощи SELECT-запроса, а потом воспользоваться запросом INSERT ... SELECT для вставки полученной промежуточной таблицы в постоянную таблицу базы данных.

  Ответить  
 
 автор: Eugene77   (15.04.2012 в 06:19)   письмо автору
 
   для: cheops   (14.04.2012 в 17:00)
 

Главное добиться нужного вам вывода при помощи SELECT-запроса,

Это понятно, но именно здесь я и застрял.
Не могу сообразить, как сделать выравнивание тестеров по количеству

  Ответить  
 
 автор: cheops   (15.04.2012 в 10:52)   письмо автору
 
   для: Eugene77   (15.04.2012 в 06:19)
 

А вы используйте COUNT(*) совместно с группировкой (GROUP BY) по уникальному идентификатору тестеров - у вас получится искомая таблица.

  Ответить  
 
 автор: Eugene77   (15.04.2012 в 12:39)   письмо автору
 
   для: cheops   (15.04.2012 в 10:52)
 

>А вы используйте COUNT(*) совместно с группировкой (GROUP BY) по уникальному идентификатору тестеров - у вас получится искомая таблица.
Я думал, если использовать группировку по уникальному идентификатору тестеров, то я получу по по одной строке на каждый тестер, а мне надо по 100 (или около того, должно настраиваться).

Я что-то упустил?

  Ответить  
 
 автор: cheops   (15.04.2012 в 12:48)   письмо автору
 
   для: Eugene77   (15.04.2012 в 12:39)
 

Если не сложно приведите краткий пример того, что есть и того, что нужно получить.

  Ответить  
 
 автор: Eugene77   (15.04.2012 в 13:09)   письмо автору
 
   для: cheops   (15.04.2012 в 12:48)
 

num, mark, tester;
1, 5.3, 1;
2, 2.4, 1;
3, 5.4, 1;
4, 5.8, 1;
5, 0.4, 2;
6, 5.4, 3;
7, 5.7, 2;
8, 5.4, 3;
9, 5.4, 1;
10, 5.4, 1;
11, 5.4, 1;
12, 5.4, 1;
13, 5.4, 1;
14, 5.4, 1;
15, 5.0, 1;
17, 5.4, 1;
18, 6.4, 1;
19, 5.4, 1;
18, 6.4, 1;
19, 5.4, 1;
20, 7.4, 1;
21, 8.4, 1;
22, 9.4, 1;

Из такой таблицы требуется получить таблицу в 9 строк (например) (на самом деле сотни строк), но количество строк меняется и завистит от совершенно других условий. В данном случае, пусть оно равно 9.
Тогда в итоговую выборку войдут все строки с номером тестера 2 и 3 так как их меньше, чем по 3,
остальное дополнится 1-м тестером (после сортировки по оценкам)

5, 0.4, 2;
6, 5.4, 3;
7, 5.7, 2;
8, 5.4, 3;
20, 7.4, 1;
21, 8.4, 1;
22, 9.4, 1;
4, 5.8, 1;
18, 6.4, 1;

  Ответить  
 
 автор: cheops   (15.04.2012 в 13:14)   письмо автору
 
   для: Eugene77   (15.04.2012 в 13:09)
 

Хм... а это число 9 сверху спускается? Что-то не очень пока понятна логика отбора строк, они случайные в рамках одного тестера или есть какая-то закономерность?

  Ответить  
 
 автор: Eugene77   (15.04.2012 в 14:01)   письмо автору
 
   для: cheops   (15.04.2012 в 13:14)
 

>Хм... а это число 9 сверху спускается? Да. Всегда разное.

Что-то не очень пока понятна логика отбора строк, они случайные в рамках одного тестера или есть какая-то закономерность?

Да, в рамках одного тестера оценки не подчиняются никакой известной мне закономерности.

Логика ... своеобразная... можно её в некотором приближении описать в связи с известной притчей о том как три слепые мудреца ощупывали одного слона и говоили, что слон - это колонна, - это труба, - это верёвка, в зависимости от того, какую часть ощупали.

Теперь тестеры тоже оценивают одно и то же, но с разных сторон.

Для формирования наиболее достоверного вывода надо взять не максимальное количество оценок, а максимально удалиться от субъективного фактора посредством учёта большего количества мнений.

Но есть ещё и другое ограничение... общее количество оценок может быть ограничено сверху.

И соответственно, вывод состоит не в получении среднего арифметического от всех оценок, а делается по алгоритму не имеющему отношения к MySQL, но набор оценок надо предварительно отфильтровать, - вот я и спросил,: возможно ли это сделать на MySQL?

  Ответить  
 
 автор: cheops   (16.04.2012 в 10:27)   письмо автору
 
   для: Eugene77   (15.04.2012 в 14:01)
 

1) В один запрос это пожалуй никак не упихнуть... по уму бы нужно сначала весовые коэффициенты ответов вычислить... или максимально допустимое количество ответов на одного тестера.
2) Боюсь вам в клиентском языке будет удобнее все это провернуть, нежели в SQL.

  Ответить  
 
 автор: Eugene77   (18.04.2012 в 12:03)   письмо автору
 
   для: cheops   (16.04.2012 в 10:27)
 

Понятно, на РНР напишу

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования