MySQL выбрать минимальное значение из таблицы с группой по - PullRequest
2 голосов
/ 02 февраля 2011

Привет всемУ меня есть таблица со значением автоинкремента с именем id, идентификатором пользователя, датой (называемой датой) и целым числом для множественных регистраций (называемых мультирегистрацией).Так как в мультирегистрации может быть несколько дат, мне нужно сначала выбрать мультирегистрацию с самой низкой датой.Вы можете сравнить его, получив минимальную дату для каждой мультирегистрации, где мне нужно получить (идентификатор) для каждой мультирегистрации.Затем следует отсортировать их по минимальной дате

Некоторые образцы данных

 id --- user-id ---   date     --- multiregistration
 1   |    2      |  2010-02-01  |  1
 2   |    3      |  2010-02-01  |  2
 3   |    4      |  2010-01-01  |  2
 4   |    2      |  2010-02-03  |  1
 5   |    4      |  2010-02-03  |  3
 6   |    1      |  2010-02-02  |  3

Ожидаемый результат

 multiregistration
  2
  1
  3

Вы можете сравнить его с

 SELECT `multiregistration`
 FROM `registrations`
 ORDER BY `date`

Но я хочу удалить дубликаты

Вот код PHP, который я сейчас использую

 // Create the query
 $query  = 'SELECT `multiregistration` AS `multireg` FROM `registrations` WHERE `multiregistration`>0 GROUP BY `multiregistration`';

 // Execute the query and set the result into a variable
 $idsTo2ndQuery = arrayExecuteLocalQueryGetResults($query);

 // Create the second Query
 $query2 = 'SELECT `multiregistration` AS `multireg` FROM `registrations` WHERE `multiregistration`='.implode(' OR `multiregistration`=', $idsTo2ndQuery).' ORDER BY `date` ASC';

 // An array of IDs (sorted)
 $ids = array();

 // Execute the query and set the result into a variable
 $idsArray = arrayExecuteLocalQueryGetResults($query2);

 // For each entry
 foreach ($idsArray AS $idArray)
      if (!in_array($idArray, $ids))
           $ids[] = $idArray;

 // Return the IDs
 return $ids;

Ответы [ 4 ]

1 голос
/ 03 февраля 2011

Вот как я мог бы сделать это в T-SQL. Он объявляет таблицу переменных для воспроизведения данных, и запрос выдает точный запрошенный результат.

DECLARE @A AS TABLE(ID INT, USERID INT, SOMEDATE DATE, MULTIREG INT)

INSERT @A
SELECT 1,2,'20100201',1 UNION ALL
SELECT 2,3,'20100201',2 UNION ALL
SELECT 3,4,'20100101',2 UNION ALL
SELECT 4,2,'20100302',1 UNION ALL
SELECT 5,4,'20100203',3 UNION ALL
SELECT 6,1,'20100202',3

SELECT * FROM @A AS A
WHERE A.SOMEDATE = (SELECT MIN(SOMEDATE) FROM @A AS B WHERE B.MULTIREG = A.MULTIREG)
ORDER BY USERID DESC

ID  USERID  SOMEDATE     MULTIREG
3    4     2010-01-01       2
1    2     2010-02-01       1
6    1     2010-02-02       3
1 голос
/ 02 февраля 2011

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

SELECT multiregistration, date 
FROM registrations 
ORDER BY multiregistration, date 

ОБНОВЛЕНИЕ:

Это даст вам набор идентификаторов ... по одному для каждого отдельногомультирегистрация, где датой является минимальная (дата) ...

SELECT id  
FROM registrations 
GROUP BY multiregistration
ORDER BY multiregistration, date 

ОБНОВЛЕНИЕ:

Это даст вам одну запись мультирегистрации ... где дата является первой датой втаблица ...

SELECT top 1 multiregistration  
FROM registrations     
ORDER BY date 

ОБНОВЛЕНИЕ: (пример данных?)

ID-----USER-ID-----DATE------------MULTIREGISTRATION
1        101            1/2/2011         3
2        101            1/1/2011         3 
3        102            1/5/2011         2
4        102            1/7/2011         2
5        103            1/1/2011         4

Минимальная дата - 01.01.2011, многократная регистрация (3) - 01.01.2011 - id2 ... Это возвратит упорядоченный (по возрастанию даты) результирующий набор, где значение мультирегистрации равно 3

SELECT * 
FROM registrations   
WHERE ID in (SELECT min(date) FROM registrations)   
ORDER BY date 

Для обоих (фактически в этом случае все 3 - # 3, 2 и 4) всписок ... следующее вернет набор результатов (показанный ниже ...)

SELECT * 
FROM registrations          
ORDER BY multiregistration, date

Возвращает набор результатов, например

3        102            1/5/2011         2
4        102            1/7/2011         2
2        101            1/1/2011         3 
1        101            1/2/2011         3
5        103            1/1/2011         4
0 голосов
/ 02 февраля 2011
SELECT MIN(date), `multiregistration` 
FROM `registrations` 
GROUP BY `multiregistration` 
ORDER by `date`
0 голосов
/ 02 февраля 2011
SELECT multiregistration FROM registrations 
GROUP BY multiregistration ORDER BY date

это делает работу?

...