0

所以我有一个看起来像这样的查询:

SELECT *
  FROM accounts
WHERE firstname = "Tom Bill"
  OR (firstname = "Tom" AND middlename = "Bill")
  OR (firstname = "Bill" AND middlename = "Tom"); 

我的目标是让查询以这种方式自行排序:

所有汤姆比尔第一
所有汤姆 + 比尔第二
所有比尔 + 汤姆第三

是否可以构建一个查询来执行此操作,或者我是否需要在控制器中处理此排序?

谢谢你们的帮助。

4

2 回答 2

1
SELECT ...
WHERE ...
ORDER BY CASE WHEN firstname = "Tom Bill" THEN 0 ELSE 1 END,
         CASE WHEN firstname = "Tom" AND middlename = "Bill" THEN 0 ELSE 1 END,
         CASE WHEN firstname = "Bill" AND middlename = "Tom" THEN 0 ELSE 1 END;

你也可以这样写:

SELECT ...
WHERE ...
ORDER BY CASE WHEN firstname = "Tom Bill" THEN 0
              WHEN firstname = "Tom" AND middlename = "Bill" THEN 1
              WHEN firstname = "Bill" AND middlename = "Tom" THEN 2
              ELSE 3 END;
于 2013-11-11T19:51:51.490 回答
0

可以通过构建 case 语句在 SQL 中执行此操作。根据您的 where 子句,它可以简化为:

ORDER BY CASE WHEN firstname = "Tom Bill" THEN 0
              WHEN firstname = "Tom" THEN 1
              ELSE 2 END

我认为通过在控制器中订购这种东西通常会更好,但是,因为生成所需的 case 语句(无论是否在 ORM 中)虽然简单,但往往有点混乱。


这将在拥有 100 万个以上帐户的数据库上运行搜索,所以我相信在查询中这样做是最好的。如果您不同意,请告诉我

这取决于您要返回的行数。

如果,正如我根据您的示例数据所怀疑的那样,您正在扫描重复数据,那么您每次都将处理少量行。在这种情况下,在您的应用程序中进行排序即使不是更好也同样好:它释放了数据库服务器上的 CPU 周期,并且如果您的最终意图是自动合并行,它允许您使用任意数量的复杂排序标准。

另一方面,如果您的查询返回大量行,则您可能不应该以 case 语句开始排序:这样做会阻止您使用正确的索引,因此这些查询会迅速蔓延到您的慢查询中日志。创建一个额外的字段(怎么样sort_namedisplay_name),索引它,相应地修改你的数据库和应用程序逻辑,然后使用它。

于 2013-11-11T19:59:21.870 回答