Mysql:在WHERE LIKE条件中按优先级排序

时间:2018-05-17 08:46:00

标签: mysql left-join sql-order-by sql-like

我希望所有产品都符合以下条件 1.产品名称喜欢"装饰" 2.列出所有类别名称的产品,例如" decor"

这是我的SQL查询

DB_NAME

我的查询工作正常,我已经退回了这样的输出

enter image description here

但我希望结果为 enter image description here

需要按产品名称订购

我该怎么做?

2 个答案:

答案 0 :(得分:0)

试试这个ORDER BY条款:

ORDER BY
    CASE WHEN P.ProductName LIKE 'Decor%' THEN 0 ELSE 1 END,
    P.ProductName;

这会将所有名称以Decor开头的产品放在首位,然后是所有其他产品。在这两个组中,我们继续按整个产品名称的字母顺序排序。

我可以提供以下完整查询:

SELECT
    t.ProductName, t.ProductPrice
FROM
(
    SELECT DISTINCT
        p.ProductName, p.ProductPrice
    FROM Products_Joined AS P
    LEFT JOIN Categories_Products_Link AS cp
        ON p.ProductId = cp.ProductId
    LEFT JOIN Categories c
        ON cp.CategoryID = c.CategoryID
    WHERE
        p.ProductName LIKE '%param%' OR
        c.CategoryName LIKE '%param%'
) t
ORDER BY
    CASE WHEN t.ProductName LIKE 'Decor%' THEN 0 ELSE 1 END,
    t.ProductName;

答案 1 :(得分:0)

请创建一个功能

 DROP FUNCTION IF EXISTS PatIndex;
 DELIMITER $$

 CREATE FUNCTION PatIndex(pattern VARCHAR(255), tblString VARCHAR(255)) 
 RETURNS INTEGER
DETERMINISTIC
BEGIN

DECLARE i INTEGER;
SET i = 1;

myloop: WHILE (i <= LENGTH(tblString)) DO

    IF SUBSTRING(tblString, i, 1) REGEXP pattern THEN
        RETURN(i);
        LEAVE myloop;        
    END IF;    

    SET i = i + 1;

   END WHILE; 

   RETURN(0);

   END

然后将其用作排序逻辑

 SELECT DISTINCT
P.ProductName,P.ProductPrice FROM
Products_Joined AS P LEFT JOIN Categories_Products_Link AS CP ON
P.ProductId = CP.ProductId LEFT JOIN Categories ON CP.CategoryID =
Categories.CategoryID where P.ProductName LIKE '%" & param &"%' OR
Categories.CategoryName LIKE '%" & param &"%'                           
 order by   SUBSTRING(P.ProductName ,PATINDEX('[A-z]',P.ProductName ),length(P.ProductName ) - PATINDEX('[A-z]',P.ProductName )+1)