mysql 选择按行分组
mysql choosing groupby row
我看到了类似问题的一些很好的答案,但我似乎仍然无法解决我的问题。
我有一个叫做 page_to_banner 的 table,看起来像这样
page_id banner_id
1 1
1 2
2 1
2 2
2 3
在管理区编辑页面时(page.php)
我想先列出连接到此页面的所有横幅,然后再列出所有其他横幅。
但如果我不这样做 GROUP BY
banner_id 那么顺序是正确的,但我得到了同一横幅的多个实例。 (显然)
如果我这样做 GROUP BY
banner_id 虽然横幅可能连接到当前页面,但为每个横幅 return 编辑的行可能不一定 return 该页面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 ";
我认为你不需要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;
我看到了类似问题的一些很好的答案,但我似乎仍然无法解决我的问题。 我有一个叫做 page_to_banner 的 table,看起来像这样
page_id banner_id
1 1
1 2
2 1
2 2
2 3
在管理区编辑页面时(page.php)
我想先列出连接到此页面的所有横幅,然后再列出所有其他横幅。
但如果我不这样做 GROUP BY
banner_id 那么顺序是正确的,但我得到了同一横幅的多个实例。 (显然)
如果我这样做 GROUP BY
banner_id 虽然横幅可能连接到当前页面,但为每个横幅 return 编辑的行可能不一定 return 该页面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 ";
我认为你不需要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;