开发中MySQL一些问题汇总

90 阅读1分钟

1,将查询出来的数据重新编号

SELECT 
  @row_number:=@row_number + 1 AS row_number, 
  t.column1, 
  t.column2, 
  ... 
FROM 
  (SELECT @row_number:=0) AS x, 
  table_name AS t 
ORDER BY 
  t.column1;

在上面的查询中,我们首先使用子查询 (SELECT @row_number:=0) AS x 初始化 @row_number 变量,并将其设置为 0。然后,我们在主查询中使用 @row_number:=@row_number + 1 表达式为每一行分配一个唯一的连续编号,并将其作为新的 row_number 列返回。最后,我们使用 ORDER BY 子句对结果进行排序。

2,通过一个字段是否包含某个值来使查询结果具备不同值

select 
CASE 
    WHEN number LIKE '%point' THEN 1
    WHEN number LIKE '%odd' THEN 2
    WHEN number LIKE '%even' THEN 2
    WHEN number LIKE '%small' THEN 3
    WHEN number LIKE '%big' THEN 3
else 0 
end as type
from orders

类似于很多编程语言,sql查询中也可以使用case when语句进行查询,使用频率比较少,导致平时很容易忽略这个用法,在这段代码中我使用case when语句来使得当number字段以不同的字符串结尾时查得出询不同的结果。

3,MySql查询时区

SELECT @@global.time_zone;

SHOW VARIABLES LIKE '%time_zone%';

2、递归

有一张代理表agent,id代表代理id,agent_id代表代理的上级,agent_id=0代表总代理,那么怎么查询总代理下所有代理的投注记录

WITH RECURSIVE agent_hierarchy AS (
    SELECT id
    FROM agent
    WHERE agent_id = 0
    UNION ALL
    SELECT a.id
    FROM agent a
    INNER JOIN agent_hierarchy ah ON a.agent_id = ah.id
)
SELECT hb.*
FROM hall_bet hb
WHERE hb.agent_id IN (SELECT id FROM agent_hierarchy);