按组选择 - 按值内联排序

时间:2018-03-30 15:59:39

标签: mysql

我想要这样的事情:

$st = $db->query("select * from posts where position = 'slider' order by inde asc");

PLUS

$st = $db->query("select * from posts where position = 'right' order by inde asc");

PLUS

$st = $db->query("select * from posts where position = 'below' order by inde asc");

因此,应使用此位置顺序(滑块右下方)选择行,但每个组内部应按inde排序。

任何帮助?

2 个答案:

答案 0 :(得分:2)

使用ORDER BY FIELD()FIELD()返回给定值列表中值的位置。

SELECT *
FROM posts
WHERE position IN ('slider', 'right', 'below')
ORDER BY FIELD(position, 'slider', 'right', 'below'), inde

答案 1 :(得分:2)

最简单的解决方案是这样的查询:

  SELECT p.*
    FROM posts p
   WHERE p.position IN ('slider','right','below')
   ORDER
      BY p.position DESC
       , p.inde ASC

(我们注意到position值的顺序可以基于字符串值...我们知道's' > 'r' > 'b'

如果我们需要不同顺序的那些,我们可以使用表达式将位置值解码为可以通过ORDER BY排序的值。 (并且有几种可能的模式,以及我们可以使用的各种表达方式。)

如果要求是运行三个单独的查询(出于性能原因?),这样的事情也会返回指定的结果:

   ( SELECT p.* FROM posts p WHERE p.position = 'slider' ORDER BY p.inde )
   UNION ALL
   ( SELECT p.* FROM posts p WHERE p.position = 'right'  ORDER BY p.inde )
   UNION ALL
   ( SELECT p.* FROM posts p WHERE p.position = 'below'  ORDER BY p.inde )

(如果我们想更明确地表达对结果进行排序的要求,MySQL还允许我们在最后一个paren之后添加一个ORDER BY来对整个集合进行排序。)