【问题标题】:MYSQL - Sort by first letterMYSQL - 按首字母排序
【发布时间】:2012-02-28 15:53:32
【问题描述】:

我有这个 sql 查询(如下),它工作得很好,但我需要修改它以仅选择第一个字符为 $a 的记录。我尝试了 LIKE A% 的几种变体,但都没有成功。我的情况的症结似乎是名称别名。如果我在 ORDER 之前使用 WHERE name LIKE 'A%',我会收到错误消息。这似乎是合乎逻辑的地方。有什么建议吗?

SELECT  
  IF(company_name <> '', company_name, PC_last_name) AS name, 
  customer_id AS id, 
  company_name AS cn, 
  PC_first_name AS pcf, 
  PC_last_name AS pcl, 
  primary_phone 
FROM sales_customer 
ORDER BY name

【问题讨论】:

    标签: mysql


    【解决方案1】:

    试试这个,它会得到name的第一个字母。

    SELECT IF(company_name <> '', company_name, PC_last_name) AS name, customer_id AS id, company_name AS cn, PC_first_name AS pcf, PC_last_name AS pcl, primary_phone
    FROM sales_customer
    ORDER BY SUBSTRING(name, 1, 1) ASC
    

    【讨论】:

    • 这返回了带有某种随机排序的整个表。我再次认为别名是问题所在。
    【解决方案2】:

    我认为您不能在WHERE 上使用别名进行此比较。试试这个:

    SELECT  
      IF(company_name <> '', company_name, PC_last_name) AS name, 
      customer_id AS id, 
      company_name AS cn, 
      PC_first_name AS pcf, 
      PC_last_name AS pcl, 
      primary_phone 
    FROM sales_customer 
    WHERE IF(company_name <> '', company_name, PC_last_name) LIKE 'A%'
    ORDER BY name
    

    【讨论】:

    • 宾果游戏!工作完美。我知道它与别名有关,有什么特殊原因导致它不能与别名一起正常工作吗?
    • 来自 MySQL 手册,apud this answer:不允许在 WHERE 子句中引用列别名,因为列值可能尚未确定WHERE 子句被执行。见见Section B.1.5.4, “Problems with Column Aliases”
    • 感谢您提供相关信息!现在我知道了。
    【解决方案3】:

    我在 dba stackexchange 上找到了这个: https://dba.stackexchange.com/questions/60137/mysql-is-it-possible-to-order-a-query-by-a-specific-letter-using-order-by

    DROP TABLE IF EXISTS products;
    
    create table products(pname CHAR(30),pdescription CHAR(30),price 
    DECIMAL(10,2),manufacturer CHAR(30));
    
    INSERT INTO products VALUES
    ('Toys','These are toys',15.25,'ABC'),
    ('Dolls','These are Dolls',35.25,'PQR'),
    ('DustPan','These are DustPan',75.25,'AZD'),
    ('Doors','These are Doors',175.25,'RAZD'),
    ('TV','These are TV',11175.25,'RAZD'),
    ('Bed','These are Bed',1175.25,'ARAZD');
    
    /** Check all data **/
    
    SELECT * FROM products;
    +---------+-------------------+----------+--------------+
    | pname   | pdescription      | price    | manufacturer |
    +---------+-------------------+----------+--------------+
    | Toys    | These are toys    |    15.25 | ABC          |
    | Dolls   | These are Dolls   |    35.25 | PQR          |
    | DustPan | These are DustPan |    75.25 | AZD          |
    | Doors   | These are Doors   |   175.25 | RAZD         |
    | TV      | These are TV      | 11175.25 | RAZD         |
    | Bed     | These are Bed     |  1175.25 | ARAZD        |
    +---------+-------------------+----------+--------------+
    6 rows in set (0.00 sec)
    
    /** Order by D% **/
    SELECT 
            pname, pdescription, price
        FROM
        products
    ORDER BY 
    CASE
        WHEN pname LIKE 'D%' THEN 1
        ELSE 2
    END;
    +---------+-------------------+----------+
     | pname   | pdescription      | price    |
    +---------+-------------------+----------+
    | Dolls   | These are Dolls   |    35.25 |
    | DustPan | These are DustPan |    75.25 |
    | Doors   | These are Doors   |   175.25 |
    | Toys    | These are toys    |    15.25 |
    | TV      | These are TV      | 11175.25 |
    | Bed     | These are Bed     |  1175.25 |
    +---------+-------------------+----------+
    6 rows in set (0.00 sec)
    

    【讨论】:

      猜你喜欢
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多