Mysql 对带有异常的SQL查询进行排序
我有一个产品表,我需要编写一个SQL查询,按照制造商的字母顺序订购这些产品 i、 eMysql 对带有异常的SQL查询进行排序,mysql,sql-order-by,Mysql,Sql Order By,我有一个产品表,我需要编写一个SQL查询,按照制造商的字母顺序订购这些产品 i、 e 按制造商从ProductsTable订单中选择* 但复杂的是,我们正试图推广一个特定的制造商。因此,该制造商的所有产品都需要排在最前面,而不是按字母顺序排列 e.g. +---------+------------+ |Product |Manufacturer| +---------+------------+ |pears |Jim | |apples |Fred
按制造商从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维护此订单。在我的情况下,我确实知道促销制造商,并且不会更改。很抱歉,我没有说清楚。在这种情况下,这是没有意义的,但我会在这里留下这个答案,以防有人有同样的问题,但在应用程序内部,而不仅仅是在查询级别。快乐编码!