Mysql JOIN查询MAX值

时间:2012-02-26 12:04:59

标签: mysql

这是我遇到的问题的一个例子。查询应返回行paulrick,因为它们具有子行的最高评级。相反,查询返回daveowen,我的猜测是因为它们是第一个子行。我按position进行分组并使用MAX(child.rating),但查询无效,就像我希望的那样。在真实表格中,我有很多列,这就是我在select子句中使用child.*的原因。

mytable的

  id |  name | parentid|  position| rating  |
   1 |  mike |    1    |    1     |    6    |
   2 |  dave |    1    |    2     |    5    |
   3 |  paul |    1    |    2     |    7    |
   4 |  john |    1    |    2     |    3    |
   5 |  mike |    5    |    1     |    8    |
   6 |  owen |    5    |    2     |    2    |
   7 |  rick |    5    |    2     |    9    |
   8 |  jaye |    5    |    2     |    3    |



$getquery = mysql_query("SELECT MAX(child.rating),child.* FROM mytable child 
        LEFT JOIN mytable parent on parent.parentid=child.parentid 
        WHERE parent.name LIKE '%mike%' GROUP BY child.position,child.parentid");



while($row=mysql_fetch_assoc($getquery)) {

 $id = $row['id'];
 $name = $row['name'];
 $parentid = $row['parentid'];



if($id==$parentid) {
    continue;
    }
echo "<p>Name: $name </p>";

}

5 个答案:

答案 0 :(得分:3)

您可以在from子句中使用子查询来首先确定每个父级的最大评级,然后获得具有该评级的子级:

select * 
from mytable c
join 
   (select parentid, max(rating) as 'maxrating'
    from mytable m
    group by parentid) as q on c.parentid=q.parentid and c.rating = q.maxrating;

答案 1 :(得分:1)

有趣的是,我刚刚意识到你在寻找什么。这是最终查询:

select t1.* from mytable t1
left join mytable t2
on t1.parentid = t2.parentid and t1.rating < t2.rating
join mytable parents
on parents.id = t1.parentid
where t2.rating is null and parents.name like '%mike%'

这是一个working example

答案 2 :(得分:0)

添加:

ORDER BY child.rating DESC

答案 3 :(得分:0)

这就是mysql的工作方式,并且实际上正常工作。

它有两种方式,子查询或连接可以获得最多的孩子,你可能想要重新排序表的方式

这是连接方法(如果我正确理解你的数据):

SELECT child.* 
FROM mytable parent 
LEFT JOIN mytable child ON parent.parentid=child.parentid 
LEFT JOIN mytable child2 ON child.parentid=child2.parentid AND child2.rating > child.rating AND child2.parentid IS NULL 
WHERE parent.name LIKE '%mike%' AND parent.position = 1 AND child.position <> 1

这假设假体的位置总是1,而孩子则不是。您可能还需要在child2加入中添加另一位,以消除父母评分高于孩子的可能性?

第二次加入确保没有其他孩子对每个家长有更高的评分。

答案 4 :(得分:0)

这一定是你想要做的事情(虽然我不确定是否真的比较孩子的父母与父母的parentid):

SELECT child.* FROM mytable child 
    INNER JOIN mytable parent on parent.parentid=child.parentid 
    LEFT JOIN mytable child2 ON (child2.parentid = parent.parentid AND child2.position = child.position AND child2.rating > child.rating)
    WHERE parent.name LIKE '%mike%' AND child2.parentid IS NULL
    GROUP BY child.position, child.parentid
    HAVING `better` = 0;

另一个选择是使用子查询,但你应该检查哪个更快:

SELECT child.*
FROM (
    SELECT MAX(child.rating) maxrating, child.parentid, child.position FROM mytable child 
        INNER JOIN mytable parent on parent.parentid=child.parentid 
        WHERE parent.name LIKE '%mike%'
        GROUP BY child.position,child.parentid
) h
    INNER JOIN mytable child ON (child.parentid = h.parentid AND child.position = h.position AND child.rating = h.maxrating)

不同尺寸的桌子的表现可能会有很大不同。

如果我没有说明你的观点,我仍然建议你使用INNER JOIN而不是OUTER如果你不需要任何东西可以加入。 INNER JOIN通常更快。

我实际上认为第二个会在更大的桌子上运行得更快。