我有一个产品表,我正在尝试上班。查询带回结果;但是,实际上并没有使用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 ......
答案 0 :(得分:1)
当数据类型为数字时,不要与'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列排序方法可以抵消这个问题。
同样,我的直觉是,第一种方法有两个列,速度会更快;在我看来更容易遵循/维护。如果定义的排序顺序发生变化,则我们必须更改代码。那么......为什么这里定义的顺序......什么不是表中定义的顺序;或者是用户作为参数传递的订单?