使用表连接时的ORDER BY字段

时间:2018-02-27 18:42:29

标签: mysql

我有一个产品表,我正在尝试上班。查询带回结果;但是,实际上并没有使用ORDER BY FIELD对结果进行排序。它以某种方式跳过它。我甚至尝试了ORDER BY FIELD(sc.id,'4','5','6'),,但也没有用。

甚至可以在table_name.column中使用ORDER BY FIELD()吗?是否有替代或更好的方法来执行此查询?

$product = $db1q->query("
SELECT p.id, p.name, p.image, p.url,p.subcat as subcat, sc.id as scid,sc.name as scname 
FROM Product as p 
JOIN Product_Sub_Category as sc ON p.subcat = sc.id 
WHERE p.visibility='1' AND find_in_set(p.id,'". $sidr['products'] ."') 
ORDER BY FIELD(p.subcat,'4','5','6'), sc.sort_order ASC, p.sort_order ASC") 
or die ('Unable to execute query. '. mysqli_error($db1q));

我只是将查询愚蠢到基本级别....

$product = $db1q->query("
SELECT id, name, image, url,subcat 
FROM Product WHERE visibility='1' AND id IN ({$sidr['products']}) ORDER BY FIELD(subcat,'5','4','6','22')") or die ('Unable to execute query. '. mysqli_error($db1q));

由于某种原因,我的子类的顺序如下....

3,12,23,5,5,4,4,4,4,4,22

为什么他们不会以5,4,6(不存在)和22开头?然后在第一次显示之后显示3,12和23 ......

1 个答案:

答案 0 :(得分:1)

简单Rextester Demo

当数据类型为数字时,不要与'string'值进行比较

例如visibility = '1'如果visibility是数字,那么你真的不应该有它的撇号。在给定field的{​​{1}}函数中也是如此。

subcat

或类似的东西:

$product = $db1q->query("SELECT id, name, image, url,subcat 
                         FROM Product 
                         WHERE visibility='1' 
                           AND id IN ({$sidr['products']}) 
                         ORDER BY case when subcat in (5,4,6,22) then 0 else 1 end, 
                                  FIELD(subcat,5,4,6,22)
  ") or die ('Unable to execute query. '. mysqli_error($db1q));

第二种方法的问题是它必须为每条记录运行一个子查询。另外,如果subcat / sort的大小超过或接近int的最大值,我们将遇到将值加在一起的问题。在第一种方法中使用2列排序方法可以抵消这个问题。

同样,我的直觉是,第一种方法有两个列,速度会更快;在我看来更容易遵循/维护。如果定义的排序顺序发生变化,则我们必须更改代码。那么......为什么这里定义的顺序......什么不是表中定义的顺序;或者是用户作为参数传递的订单?