2016-07-15 31 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