这是我遇到的问题的一个例子。查询应返回行paul
和rick
,因为它们具有子行的最高评级。相反,查询返回dave
和owen
,我的猜测是因为它们是第一个子行。我按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>";
}
答案 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通常更快。
我实际上认为第二个会在更大的桌子上运行得更快。