MySQL从带有group by的表中选择最小值

MySQL从带有group by的表中选择最小值,sql,mysql,select,group-by,Sql,Mysql,Select,Group By,大家好 我有一个表,它有一个称为id的自动递增值、一个用户id、一个称为date的日期和一个称为multiregistration的整数,用于多次注册 由于多重注册可以有多个日期,我需要首先选择日期最低的多重注册 您可以通过获取每次多重注册的最短日期进行比较,我需要获取每次多重注册的id。然后,它应该按最短日期对它们进行排序 一些样本数据 预期产量 你可以把它比作 SELECT `multiregistration` FROM `registrations` ORDER BY `date`

大家好 我有一个表,它有一个称为id的自动递增值、一个用户id、一个称为date的日期和一个称为multiregistration的整数,用于多次注册 由于多重注册可以有多个日期,我需要首先选择日期最低的多重注册
您可以通过获取每次多重注册的最短日期进行比较,我需要获取每次多重注册的id。然后,它应该按最短日期对它们进行排序

一些样本数据

预期产量

你可以把它比作

 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;

它正在工作吗?

如果按多重注册分组,则每个不同的多重注册只能得到一行。这将为您提供所有行的集合,这些行首先按多重注册排序,然后按日期排序

SELECT MIN(date), `multiregistration` 
FROM `registrations` 
GROUP BY `multiregistration` 
ORDER by `date`
SELECT multiregistration, date 
FROM registrations 
ORDER BY multiregistration, date 
更新:

这将给你一组ID…一个用于每个不同的多重注册,其中日期是mindate

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
最短日期是2011年1月1日多重注册3将是2011年1月1日-id 2。。。 这将返回按升序排序的日期结果集,其中多重注册值为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

下面是我在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

我只需要多重注册的ID哦,你误解了我,我需要多重注册,但它不应该只按日期按多重注册排序,它应该是多重注册的第一个日期那么你要找一个整数值一个计数?存储在表中第一个最早日期的多重注册中?或您是否在寻找存储在多重注册中的每个不同用户id的第一个最早日期的整数值?您可以通过获取每个多重注册的最小日期进行比较,我需要获取每个多重注册的id。然后它应该按最短日期对它们进行排序这是我正在搜索的内容,但我需要同时输出这两个数据,并且不应该超时,因为在PHPMyAdminThat中这样做并没有起到作用。我甚至试过按顺序将SELECT DISTINCT MULTIRGISTER作为注册的MULTIRGIDdate@The87Boy-你有什么错误吗?或者你能在你的问题中写下一些预期的样本输出吗?我可以尝试再次解释我想要什么我需要选择多个注册的ID,可以是分组方式,也可以是不同的,它应该是按日期排序的。我没有收到任何错误。我认为您需要提供一些示例数据以及该示例数据的预期输出。@Scorpi0这样更好吗?
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
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