mysql选择groupby行

时间:2015-07-24 10:57:56

标签: mysql group-by sql-order-by

我已经看到了类似问题的一些好的答案,但我似乎仍然无法解决我的问题。 我有一个名为page_to_banner的表,看起来像这样

page_id    banner_id   
1             1   
1             2    
2             1   
2             2  
2             3   

在管理区域内,编辑页面(page.php)

我想首先列出所有连接到此页面的横幅,然后列出所有其他横幅。

但如果我不GROUP BY banner_id,那么订单是正确的,但我得到同一横幅的多个实例。 (显然)

如果我执行GROUP BY banner_id虽然横幅可能已连接到当前页面,但为每个横幅返回的行可能不一定返回该页面ID。那里将被列入。

$sql = " SELECT * FROM banner AS b ";
$sql.= " LEFT JOIN page_to_banner AS p2b on(b.banner_id=p2b.banner_id) ";
$sql.= " GROUP BY p2b.banner_id";
$sql.= " ORDER BY p2s.page_id ='" . $page_id . "' ,b.date_modified ";   

1 个答案:

答案 0 :(得分:1)

我认为您不需要group by

select b.*
from banners b
order by (exists (select 1
                  from page_to_banner p2b
                  where p2b.banner_id = b.banner_id and
                        p2b = $page_id
                 )
         ) desc,
         b.date_modified;

我不鼓励使用group by,因为这会产生额外的开销。

如果page_to_banner没有重复项,您也可以执行以下操作:

select b.*
from banner b left join
     page_to_banner p2b
     on p2b.banner_id = b.banner_id and p2b.page_id = $page_id
order by (p2b.page_id is null) desc, b.date_modified;