Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.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
Mysql 对带有异常的SQL查询进行排序_Mysql_Sql Order By - Fatal编程技术网

Mysql 对带有异常的SQL查询进行排序

Mysql 对带有异常的SQL查询进行排序,mysql,sql-order-by,Mysql,Sql Order By,我有一个产品表,我需要编写一个SQL查询,按照制造商的字母顺序订购这些产品 i、 e 按制造商从ProductsTable订单中选择* 但复杂的是,我们正试图推广一个特定的制造商。因此,该制造商的所有产品都需要排在最前面,而不是按字母顺序排列 e.g. +---------+------------+ |Product |Manufacturer| +---------+------------+ |pears |Jim | |apples |Fred

我有一个产品表,我需要编写一个SQL查询,按照制造商的字母顺序订购这些产品

i、 e

按制造商从ProductsTable订单中选择*

但复杂的是,我们正试图推广一个特定的制造商。因此,该制造商的所有产品都需要排在最前面,而不是按字母顺序排列

e.g.

+---------+------------+
|Product  |Manufacturer|
+---------+------------+
|pears    |Jim         |
|apples   |Fred        |
|tomatoes |Adam        |
|oranges  |Bob         |
|bananas  |Fred        |
|grapes   |Carl        |
+---------+------------+

If we are promoting Fred, the query would result in

+---------+------------+
|Product  |Manufacturer|
+---------+------------+
|apples   |Fred        |
|bananas  |Fred        |
|tomatoes |Adam        |
|oranges  |Bob         |
|grapes   |Carl        |
|pears    |Jim         |
+---------+------------+

有什么方法可以做到这一点吗?

在“制造商”旁边,输入一个新字段:权重,并将权重1指定给提升制造商,将权重0指定给其他制造商,然后编写您的查询:

SELECT * FROM ProductsTable ORDER BY Weight, Manufacturer
要推广制造商Fred,请使用:

UPDATE ProductsTable SET Weight = 0;
UPDATE ProductsTable SET Weight = 1 WHERE Manufacturer='Fred';
(最好将这两个
update
查询包装到事务中)

尝试:

SELECT *, CASE WHEN Manufacturer = 'Fred' THEN 0 ELSE 1 END AS Ordering
FROM ProductsTable 
ORDER BY Ordering, Manufacturer

根据我使用Microsoft Access数据库的经验,类似的东西应该可以工作,但我希望在其他一些SQL数据库中也可以工作

SELECT * FROM ProductsTable ORDER BY (Manufacturer='Fred'), Manufacturer;

但有了这一点,他就必须在编写代码时了解制造商在推广什么。升级的制造商必须存储在数据库中,因为如果我很了解Urbycoz的话,它并不总是Fred。@vucetica一点也不,因为它的最终实现肯定是“CASE WHEN manufacturer=@PromotedManufacturer”,它将是一个查询参数。该参数的值可以在任何地方出现,但这不应该是一个问题,因为被提升的制造商当然应该存储在某个地方。我认为这比增加一个字段并保存它要好。我是这样看的:当你设置@promotedManufacturer参数时,它必须从任何地方设置,就像你说的,但“anywhere”又是源代码。他可以从某个配置文件中读取该参数,这意味着“Fred”是在配置文件中设置的,或者是从数据库中设置的。从配置文件中读取它是好的,但又是一种“硬编码”,因为从一些“管理面板”中更改它不是一件好事,所以正确的解决方案是将“Fred”存储在数据库中。其中一个方法是在弗雷德、迈克和约翰旁边挂上国旗,他们都是被提升的制造商。在我的情况下,被提升的制造商不会改变。很抱歉,我没有说清楚。@Firoz Ansari这项工作非常出色,正是我所需要的。非常感谢你!同意。除非他知道哪个制造商将被提拔,否则没有什么好方法可以满足他的需求。我认为为排序顺序添加另一列是有意义的。这也允许用户通过UI维护此订单。在我的情况下,我确实知道促销制造商,并且不会更改。很抱歉,我没有说清楚。在这种情况下,这是没有意义的,但我会在这里留下这个答案,以防有人有同样的问题,但在应用程序内部,而不仅仅是在查询级别。快乐编码!