【问题标题】:How to make this sql query compatible for older verisons of mysql such v.5.5 and above?如何使这个 sql 查询与旧版本的 mysql 兼容,例如 v.5.5 及更高版本?
【发布时间】:2021-04-02 20:25:25
【问题描述】:

我有这个查询,它适用于 MySQL 8.0,但不适用于 MySQL 5.5 等以下版本。当我在 Web 服务器上收到此错误时如何使其兼容:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 11 行的 '(partition by pid order by age' 附近使用正确的语法

SELECT p.id,  p.pid, p.name, 
       MAX(CASE WHEN t.dr = 1 THEN t.name END) as name1,
       MAX(CASE WHEN t.dr = 1 THEN age END) as age1,
       MAX(CASE WHEN t.dr = 2 THEN t.name END) as name2,
         MAX(CASE WHEN t.dr = 2 THEN t.age END) as age2,
            MAX(CASE WHEN t.dr = 3 THEN t.name END) as name3,
         MAX(CASE WHEN t.dr = 3 THEN t.age END) as age3,
             MAX(CASE WHEN t.dr = 4 THEN t.name END) as name4,
         MAX(CASE WHEN t.dr = 4 THEN t.age END) as age4
FROM Table1 p
join (select id , pid, name, age,  DENSE_RANK() OVER (partition by pid order by age) as dr
from Table2) t on p.pid= t.pid
group by p.id, p.pid, p.name

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=d324e7654218dae3d1168df2bf529099

【问题讨论】:

    标签: mysql sql


    【解决方案1】:
     select version();
    
    version()
    5.5.62

    架构:

     CREATE TABLE Table1
         (id int , name varchar(15) , pid int   )
    
     INSERT INTO Table1
      values   (1, 'Jack', 1521), 
      (2, 'Steve',1522)
    
     CREATE TABLE Table2
         (id  int, pid int, name varchar(15), age int);
     
     INSERT INTO Table2
        
     VALUES
         (1, 1521, 'John', 12),
         (2, 1521, 'Maria', 7),
         (3, 1521, 'Larry', 3),
         (4, 1522, 'Harry', 5)
    

    查询:

     SELECT p.id,  p.pid, p.name, 
            MAX(CASE WHEN t.dr = 1 THEN t.name END) as name1,
            MAX(CASE WHEN t.dr = 1 THEN age END) as age1,
            MAX(CASE WHEN t.dr = 2 THEN t.name END) as name2,
              MAX(CASE WHEN t.dr = 2 THEN t.age END) as age2,
                 MAX(CASE WHEN t.dr = 3 THEN t.name END) as name3,
              MAX(CASE WHEN t.dr = 3 THEN t.age END) as age3,
                  MAX(CASE WHEN t.dr = 4 THEN t.name END) as name4,
              MAX(CASE WHEN t.dr = 4 THEN t.age END) as age4
     FROM Table1 p
     join (select id , pid, name, age,  (select count(*) from Table2 t2
     where  t.pid=t2.pid and t2.age<=t.age) as dr
     from Table2 t) t on p.pid= t.pid
     group by p.id, p.pid, p.name
    

    输出:

    id pid name name1 age1 name2 age2 name3 age3 name4 age4
    1 1521 Jack Larry 3 Maria 7 John 12 null null
    2 1522 Steve Harry 5 null null null null null null

    db小提琴here

    【讨论】:

      【解决方案2】:

      一种方法是用相关子查询替换DENSE_RANK()

      FROM Table1 p JOIN
           (SELECT t2.*,
                   (SELECT COUNT(DISTINCT tt2.age)
                    FROM table2 tt2
                    WHERE tt2.pid = t2.pid AND
                          tt2.age <= t2.age
                   ) as dr
            FROM Table2 t2
           ) t 
           ON p.pid = t.pid
      

      Here 是一个 dbfiddle。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-30
        • 1970-01-01
        • 2011-05-14
        • 2021-07-26
        • 1970-01-01
        相关资源
        最近更新 更多