2014-11-08 64 views
-1

这里是我的查询:如何分组排序?

SELECT * 
FROM `recordstouser` 
GROUP BY IdUserRecordstouser 
ORDER BY IdRecordstouser DESC; 

在桌子上有一个字段StatusRecordstouser可以取值0/1。 所以我需要得到分组的行通过IdUserRecordstouser如在分组行会的行wtih StatusRecordstouser = 0;

例如:

id | StatusRecordstouser | IdUserRecordstouser 
1 1      2 
2 1      2 
3 0      2 
4 0      3      

输出2行:

4 | 0 | 3 
3 | 0 | 2 

最正确的版本:

SELECT * FROM (SELECT * FROM `recordstouser` WHERE StatusRecordstouser = 0) t 
JOIN detailtousers ON detailtousers.idDetailToUsers = t.IdUserRecordstouser 
WHERE t.IdtoUserRecordstouser = 458 
GROUP BY t.IdUserRecordstouser ORDER BY t.id DESC 

错误:

Unknown column 't.IdtoUserRecordstouser' in 'where clause' 
+0

请问您能解释一下吗? – 2014-11-08 16:55:11

+0

这是怎么回事: SELECT * FROM FROM“recordstouser” ORDER BY IdUserRecordstouser DESC – 2014-11-08 18:22:11

+0

谁给我减点?如果你没有什么可以做更多的 - 离开网站 – AhmedFaud 2014-11-08 18:23:28

回答

1

试试这个。我知道你说过你不能使用WHERE,但这有点不同。你可以看到结果这里:http://sqlfiddle.com/#!2/8b5a0/11

SELECT * 
FROM 
(
    SELECT * 
    FROM `recordstouser` 
    WHERE StatusRecordstouser = 0 
) t 
GROUP BY t.IdUserRecordstouser 
ORDER BY t.id DESC; 

,你可以也ORDER BY t.StatusRecordstouser ASC代替ORDER BY t.id DESC先得到0。

+0

似乎工作,我编辑的问题与JOIN错误 – AhmedFaud 2014-11-08 21:58:18

+0

您是否试图将此查询的结果加入到另一个表中? – mhester 2014-11-08 22:38:50

3

组功能:使用MAX()MIN()的MySQL。

第二种情况:

SELECT * 
FROM (SELECT * FROM `recordstouser` GROUP BY IdUserRecordstouser) as data 
ORDER BY IdRecordstouser; 
+0

无法正确执行此查询,它返回我行wuth一个状态= 1 – AhmedFaud 2014-11-08 18:04:13

3

为什么你需要group by?只需使用where

SELECT * 
FROM `recordstouser` 
WHERE IdRecordstouser = 0; 

EDTI:

所以,你想要一个偏好为0,如果该行是可用的。

你可以做到这一点是:

SELECT * 
FROM recordstouser rtu 
WHERE IdRecordstouser = 0 
UNION ALL 
SELECT * 
FROM recordstouser rtu 
WHERE NOT EXISTS (SELECT 1 
        FROM recordstouser rtu2 
        WHERE rtu2.IdUserRecordstouser = rtu.IdUserRecordstouser AND rtu2.IdRecordstouser = 0 
       ) AND 
     NOT EXISTS (SELECT 1 
        FROM recordstouser rtu2 
        WHERE rtu2.IdUserRecordstouser = rtu.IdUserRecordstouser AND rtu2.Id > rt.Id 
       ); 

这假定有表中的其他列。对于您的数据(及其合理的变体),这将工作:

SELECT id, StatusRecordstouser, IdUserRecordstouser 
FROM recordstouser rtu 
WHERE IdRecordstouser = 0 
UNION ALL 
SELECT MAX(id), 1, IdUserRecordstouser 
FROM recordstouser rtu 
GROUP BY rtu.IdUserRecordstouser 
HAVING SUM(IdRecordstouser = 0) = 0; 
+0

WHERE不能使用,我需要得到0/1的所有行,但如果0 - 首先显示它 – AhmedFaud 2014-11-08 17:51:02

1

您的问题在我看来,您只想显示'statusrecordstouser'列为0(对于每个用户)的行,但如果不存在,则显示'statusrecordstouser'为1的行。如果这是正确的,考虑这样的事情。

SELECT MAX(id), statusrecordstouser, iduserrecordstouser 
FROM myTable 
GROUP BY statusrecordstouser, iduserrecordstouser 
ORDER BY iduserrecordstouser, statusrecordstouser; 

这将返回两行,如果用户有0和1,或者一行,如果他们只有一个或另一个。我已经下令将它们放入符合要求的顺序(0行总是先行)。如果一个组发生多次,我使用最大值获取最新的行。

为了说明我的意思,这是上述查询的输出是什么:

| id | status | idUser | 
+----+--------+--------+ 
| 3 | 0 | 2 | 
+----+--------+--------+ 
| 2 | 1 | 2 | 
+----+--------+--------+ 
| 4 | 0 | 3 | 
+----+--------+--------+ 

现在的问题是,你怎么了两行之间的区别?那么,你不需要,你只需要从每个分组中拿出第一个,因为如果它是0,你会拿它,如果没有0,那么它将是1,你也可以拿它。请参阅此question以了解如何获取组中的第一项。

查询看起来是这样的:

SELECT t.id, t.statusrecordstouser, t.iduserrecordstouser 
FROM(SELECT MAX(id) AS id, statusrecordstouser, iduserrecordstouser 
    FROM myTable 
    GROUP BY statusrecordstouser, iduserrecordstouser 
    ORDER BY iduserrecordstouser, statusrecordstouser 
    ) t 
WHERE(SELECT COUNT(*) 
     FROM(SELECT MAX(id) AS id, statusrecordstouser, iduserrecordstouser 
      FROM myTable 
      GROUP BY statusrecordstouser, iduserrecordstouser 
      ORDER BY iduserrecordstouser, statusrecordstouser 
    ) tt 
     WHERE tt.iduserrecordstouser = t.iduserrecordstouser AND tt.statusrecordstouser <= t.statusrecordstouser 
) <= 1; 

SQL Fiddle测试这和它的工作。我甚至添加了一个只有状态1的行,以确保它能够正常工作。