Php MySQL-JOIN和MAX

Php MySQL-JOIN和MAX,php,mysql,join,max,Php,Mysql,Join,Max,嗨,我有一个查询,它通过显示首先被评分的评论,然后是尚未被评分的评论来实现我想要的。然而,我似乎不能使它的秩序正确 结果应该是什么样的: 5 4 0 0 ... 目前它正在这样做: 4 5 0 0 ... 这是我的问题 $sql = $db->query( " SELECT branch.*, MAX(review.rating) AS m FROM branch LEFT OUTER JOIN review ON branch.bid = review.bid

嗨,我有一个查询,它通过显示首先被评分的评论,然后是尚未被评分的评论来实现我想要的。然而,我似乎不能使它的秩序正确

结果应该是什么样的:

5
4
0
0
...
目前它正在这样做:

4
5
0
0
...
这是我的问题

$sql = $db->query( "
    SELECT branch.*, MAX(review.rating) AS m
    FROM branch
    LEFT OUTER JOIN review ON branch.bid = review.bid
    WHERE branch.address2 LIKE '$query' OR branch.postcode LIKE '$query-%'
    GROUP BY branch.bid
    ORDER BY m DESC, branch.branch ASC
    LIMIT $start,$limit 
" ) or die( "Select failed: (" . $db->errno . ") " . $db->error );

Meghraj Choudhary的子查询解决方案应该可以工作

但是,联接速度更快。子查询需要额外的磁盘访问。假设branch.bid是主键,则以下速度应更快:

SELECT b1.*, b2.m FROM branch b1
INNER JOIN
(
SELECT branch.bid, MAX(review.rating) AS m
FROM branch
LEFT OUTER JOIN review ON branch.bid = review.bid
WHERE branch.address2 LIKE '$query' OR branch.postcode LIKE '$query-%'
GROUP BY branch.bid
LIMIT $start,$limit
) b2 ON
b1.bid = b2.bid
ORDER BY b2.m DESC, b1.branch ASC

我没有试过这个。所以,请尝试并发回。

如果您在那时删除组,我认为您将得到您想要的结果,因为记录首先分组,然后在组中排序。如果我在那时删除组,则只有1个结果显示这不是速率。我认为这里没有看到问题,您可以将sqls放在SQLFIDDLE上吗?您可能必须运行内部查询,如SELECT branch.*,从review中选择maxreview.rating,其中branch.bid=review.bid作为m从branch左侧加入branch.bid=review.bid,其中branch.address2类似于“$query”或branch.postcode类似于“$query-%”的GROUP BY branch.bid ORDER BY m DESC,branch.branch ASC LIMIT$start,$LIMIT感谢您的回复,我尝试了您的解决方案,但它仍然给出了与以前相同的结果。似乎评级审查是按升序排列的,而不是按顺序排列的descending@Jack威尔莫-不知道为什么会发生这种情况!b2.m DESC的订单,应该处理好的。我发现了,这是我自己的错误。我需要的是AVG,而不是MAX,因为同一篇评论有两个评分,他们给出了错误的结果。感谢您的帮助,您的解决方案似乎更有效率。