select S.*,
(select S1.location from services S1 where S1.main = S.main and (S1.list is null or S1.list = '')) head_index
from services S
order by head_index, S.list is null or S.list = '' desc, S.location is null or S.location = '' desc, S.location
(select S1.location from services S1 where S1.main = S.main) min_id
<ul><p><b>Цветы</b></p></ul>
<ul><li>Розы</li></ul>
<ul><li>Ромашки</li></ul>
<p><b>Цветы</b></p>
<ul>
<li>Розы</li>
<li>Ромашки</li>
...
</ul>
<ul>
<li>
<b>Цветы</b>
<ul>
<li>Розы</li>
<li>Ромашки</li>
...
</ul>
</li>
<li>
<b>Животные</b>
<ul>
<li>Коровы</li>
<li>Козы</li>
...
</ul>
</li>
...
<ul>