【问题标题】:Ordering by a prototype按原型订购
【发布时间】:2011-10-15 05:30:11
【问题描述】:

在一个 MySQL 字段中有 6 个可能的键。让我们称它们为类型。通过 PHP,我定义了一个数组,称为 $order,并按照我希望它们出现的顺序排列这些类型。

有一个表articles,其中有一个字段articles.type。任何文章都可以添加 0-6 种类型。现在,我想做的,是获取所有文章,并从原型中订购它们。做这个的最好方式是什么?这可以在 MySQL 中完成,因为我想这会更快吗?如果没有,如何在 PHP 中完成?

例子:

表:

id     articleId     type
1      3             type1
2      3             type2
3      3             type3
4      3             type4
5      4             type5
6      4             type6
7      5             type5
8      7             type1
9      7             type5

订单:

$order=array('type1','type2','type3','type4','type5','type6');

如何获取按我的$order 变量排序的结果?

【问题讨论】:

标签: php mysql sorting


【解决方案1】:

您需要将该数组转换为 mysql 样式的 if/case 语句:

$order_by = "ORDER BY CASE";
$pos = 1;
foreach ($order as $clause) {
   $order_by .= " CASE `type`='$clause' THEN " . $pos++;
}
$order_by .= " ELSE " . $pos++;

这会产生类似的东西

ORDER BY CASE
   WHEN `type`='type1' THEN 1
   WHEN 'type`='type2' THEN 2
   ...
   ELSE n

【讨论】:

  • 不错。明天试试。谢谢!
【解决方案2】:

这可以在 MySQL 中完成吗,因为我认为这样会更快?

仅当您允许 MySQL 使用索引时

您可以创建一个临时表:

$query = "CREATE TABLE IF NOT EXISTS test (
            sort INT NOT NULL AUTO_INCREMENT,
            `type` VARCHAR(20) NOT NULL,
          PRIMARY KEY (sort),
          KEY (`type`, sort)  
          ENGINE=MEMORY (SELECT 1,'other' <<-- see query below.
                   UNION SELECT 2,'type1' <<-- build this part using 
                   UNION SELECT 3,'type2' <<-- Marc B's code.
                   UNION SELECT 4,'type3'
                   UNION SELECT 5,'type4'   
                   UNION SELECT 6,'type5'
                   UNION SELECT 7,'type6' ";

运行此查询。

现在您可以使用联接链接此查询,并使用 test.sort 作为您的排序键:

SELECT t1.id, t1.article_id, COALESCE(t.`type`,'other') as sort_type
FROM table1 t1
LEFT JOIN test t ON (t1.`type` = t.`type`)
WHERE ....
ORDER BY t.sort;                   

此查询将被完全索引并尽可能快地运行。

【讨论】:

  • 如果我理解正确的话,这个引擎会将所有数据保存在内存中。停电或重启怎么办?
  • @janis 这只是一个临时表,用于在代码重新启动时设置它的排序顺序,如果您希望它永久保存,请使其成为 innodb 表
  • 我阅读了临时表,现在我很清楚了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 2010-10-30
  • 2020-09-08
  • 1970-01-01
  • 2018-03-04
相关资源
最近更新 更多