2016-07-15 36 views
0

我有这个疑问排名MySQL的具体ID

SELECT concours_photo_like.id , COUNT(concours_photo_like.id) AS nb_like , (@rank := @rank + 1) AS rank 
FROM (SELECT @rank := 0) as r , concours_photo_like 
JOIN concours_photo ON concours_photo.id = concours_photo_like.id_concours_photo 
WHERE concours_photo.id_concours = 67 
GROUP BY concours_photo_like.id_concours_photo 

这里的结果

| id  | nb_like | rank | 
|--------|------------|------| 
| 110 |   2 | 2 | 
| 104 |   3 | 1 | 
| 134 |   1 | 4 | 
| 176 |   1 | 5 | 
| 113 |   2 | 3 | 

我如何获得例如特定标识的等级,如果我想的ID 134等级

我想是这样

SELECT concours_photo_like.id , COUNT(concours_photo_like.id) AS nb_like , (@rank := @rank + 1) AS rank 
FROM (SELECT @rank := 0) as r , concours_photo_like 
JOIN concours_photo ON concours_photo.id = concours_photo_like.id_concours_photo 
WHERE concours_photo.id_concours = 67 
AND concours_photo_like.id = 134 
GROUP BY concours_photo_like.id_concours_photo 

但结果是

| id  | nb_like | rank | 
|--------|------------|------| 
| 134 |   1 | 1 | 

,结果应为等级为4而不是1

+0

如果你喜欢,可以考虑下列行为这个简单的两步过程:1.如果您还没有这样做,提供适当的CREATE和INSERT语句(和/或sqlfiddle),以便我们可以更容易地复制问题。 2.如果您尚未这样做,请提供与步骤1中提供的信息相对应的所需结果集。 – Strawberry

回答

2

在将任何值赋给选择列表中的用户变量之前,MySQL执行where子句。

您必须过滤having子句或将查询包装到外部查询中的子查询和过滤器中。

有:

SELECT concours_photo_like.id , COUNT(concours_photo_like.id) AS nb_like , (@rank := @rank + 1) AS rank 
FROM (SELECT @rank := 0) as r , concours_photo_like 
JOIN concours_photo ON concours_photo.id = concours_photo_like.id_concours_photo 
WHERE concours_photo.id_concours = 67 
GROUP BY concours_photo_like.id_concours_photo 
HAVING concours_photo_like.id = 134 

子查询:

SELECT * 
FROM 
    (SELECT concours_photo_like.id , COUNT(concours_photo_like.id) AS nb_like , (@rank := @rank + 1) AS rank 
    FROM (SELECT @rank := 0) as r , concours_photo_like 
    JOIN concours_photo ON concours_photo.id = concours_photo_like.id_concours_photo 
    WHERE concours_photo.id_concours = 67 
    GROUP BY concours_photo_like.id_concours_photo 
    ) t1 
WHERE t1.id = 134 
+0

它运作良好!非常感谢 – user492642

2

如何与另一个SELECT声明包装原始查询,然后由id这样的过滤:

SELECT * FROM 
(SELECT concours_photo_like.id , COUNT(concours_photo_like.id) AS nb_like , (@rank := @rank + 1) AS rank 
FROM (SELECT @rank := 0) as r , concours_photo_like 
JOIN concours_photo ON concours_photo.id = concours_photo_like.id_concours_photo 
WHERE concours_photo.id_concours = 67 
GROUP BY concours_photo_like.id_concours_photo) AS nb 
WHERE nb.id = 134 

有可能有一个更优雅的方式来执行此查询,但这是现在想到的。

+0

您的解决方案也可以使用:)谢谢 – user492642