Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 原型订购_Php_Mysql_Sorting - Fatal编程技术网

Php 原型订购

Php 原型订购,php,mysql,sorting,Php,Mysql,Sorting,MySQL字段中有6个可能的键。让我们称之为类型。通过PHP,我定义了一个名为$order的数组,并按照我希望它们出现的顺序排列这些类型 有一个表,articles,它有一个字段articlestype。任何文章都可以添加0-6种类型。现在,我想做的是抓取所有的文章,并从原型中订购它们。最好的方法是什么?这可以在MySQL中完成吗,因为我认为这样会更快?如果没有,如何在PHP中实现 例如: 表: id articleId type 1 3 typ

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
变量排序的结果?

您需要将该数组转换为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
这可以在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' ";

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

可能会有所帮助。很好。我明天会试试的。谢谢如果我理解正确,此引擎会将所有数据保存在内存中。断电或重启又如何?@janis这只是一个临时表,用于排序顺序。当代码重启时,您需要设置临时表。如果您希望它是永久性的,请将其设置为innodb表。我在临时表上读取了它,现在我清楚了。谢谢
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;