我们如何才能从此查询中获得最佳视频ID ..?

时间:2014-03-08 04:49:14

标签: mysql

SELECT VIDEO_ID,MAX(VIDEO) AS MAX 
FROM (SELECT VIDEO_ID,AVG(VIDEO_RATING)AS VIDEO 
      FROM VIDEO_RATING_TABLE 
      GROUP BY VIDEO_ID)T 
GROUP BY VIDEO_ID;

这是我能得到的MAX(AVG)。此查询的结果如下:

|VIDEO_ID | MAX    |  PLACE_ID

|        1 | 3.6667 |  1

|        2 | 4.0000 |  1 

|        3 | 4.5714 |  2 

但我希望此表中的VIDEO_ID max是最大的ORDER BY PLACE_ID。 SO VIDEO_ID应该是2,3 ....我可能有单个地方的多个视频,我需要来自每个地方的顶级视频......以及用户输入PLACE_ID的条件....

| VIDEO_ID | VIDEO_RATING | PLCAE_ID| USER_ID       | VIDEO_RATING_ID |

|        1 |            5 | 000001 | YTER@gmail.com |               1 |

|        1 |            5 | 000001 | Z@gmail.com    |               2 |

|        1 |            1 | 000002 | YTER@gmail.com |               3 |

|        2 |            1 | 000001 | YTER@gmail.com |               4 |

|        2 |            5 | 000001 | YTER@gmail.com |               5 |

|        2 |            5 | 000001 | YTER@gmail.com |               6 |

|        2 |            5 | 000001 | YTER@gmail.com |               7 |

|        3 |            5 | 000001 | YTER@gmail.com |               8 |

|        3 |            4 | 000001 | YTER@gmail.com |               9 |

|        3 |            3 | 000001 | YTER@gmail.com |              10 |

|        3 |            5 | 000001 | YTER@gmail.com |              11 |

|        3 |            5 | 000001 | YTER@gmail.com |              12 |

|        3 |            5 | 000001 | YTER@gmail.com |              13 |

|        3 |            5 | 000001 | YTER@gmail.com |              14 |

上一个查询给出的错误是ERROR 1248(42000):每个派生表都必须有自己的别名

2 个答案:

答案 0 :(得分:0)

预先ORDER BY MAX DESC LIMIT 1;到您的查询

SELECT VIDEO_ID,MAX(VIDEO) AS `MAX` FROM (SELECT VIDEO_ID,AVG(VIDEO_RATING)AS VIDEO FROM VIDEO_RATING_TABLE  GROUP BY VIDEO_ID)T GROUP BY VIDEO_ID ORDER BY `MAX` DESC LIMIT 1;

答案 1 :(得分:0)

试试这个:

您可以在查询中添加ORDER BY子句:

SELECT VIDEO_ID,MAX(VIDEO) AS MAX 
FROM (
    SELECT VIDEO_ID,AVG(VIDEO_RATING)AS VIDEO 
    FROM VIDEO_RATING_TABLE 
    GROUP BY VIDEO_ID)T 
GROUP BY VIDEO_ID 
ORDER BY MAX DESC LIMIT 1;

它将按MAX的降序对表进行排序,并选择第一行。

结果将是:

VIDEO_ID    MAX
3           4.5714

请参阅SQL Fiddle

中的结果

OR 您可以在查询中添加WHERE子句并删除GROUP BY子句:

SELECT VIDEO_ID,VIDEO AS MAX 
FROM (
    SELECT VIDEO_ID,AVG(VIDEO_RATING)AS VIDEO 
    FROM VIDEO_RATING_TABLE 
    GROUP BY VIDEO_ID)T 
WHERE VIDEO=MAX(VIDEO)

它会选择VIDEO_ID最高AVG(VIDEO_RATING)AVG(VIDEO_RATING)

修改

根据新问题,试试这个:

SET @PlaceID =-1 ;
SELECT VIDEO_ID,MAX(MAX) as MAX,PLACE_ID 
FROM (SELECT VIDEO_ID,MAX(VIDEO) AS MAX,PLACE_ID 
      FROM (SELECT VIDEO_ID,AVG(VIDEO_RATING)AS VIDEO,PLACE_ID 
            FROM VIDEO_RATING_TABLE 
            GROUP BY VIDEO_ID,PLACE_ID)T 
      GROUP BY VIDEO_ID,PLACE_ID;)
WHERE (@PlaceID =-1 OR PLACE_ID=@PlaceID)
GROUP BY PLACE_ID

将用户输入PLACE_ID作为@PlaceID,它将选择该地点的最高评分。

请参阅Fiddle

中的示例

添加了另一个技巧:如果您希望查看所有地点的最大值,请将-1作为@PlaceID传递。

请参阅Fiddle

中的示例

注意:如果您愿意在表VIDEO_RATING_TABLE中向我们展示一些示例数据,我希望我们可以优化查询,从而提高性能。