GVKun编程网logo

@ Symbol-MySQL中递归SELECT查询的解决方案?(mysql如何实现递归查询效果)

10

在本文中,我们将带你了解@Symbol-MySQL中递归SELECT查询的解决方案?在这篇文章中,我们将为您详细介绍@Symbol-MySQL中递归SELECT查询的解决方案?的方方面面,并解答mys

在本文中,我们将带你了解@ Symbol-MySQL中递归SELECT查询的解决方案?在这篇文章中,我们将为您详细介绍@ Symbol-MySQL中递归SELECT查询的解决方案?的方方面面,并解答mysql如何实现递归查询效果常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的5- MySQL数据库SELECT查询操作、database – 在mySQL中优化嵌入式SELECT查询、MSSQL中递归SQL查询语句实例说明-、MySQL Select查询

本文目录一览:

@ Symbol-MySQL中递归SELECT查询的解决方案?(mysql如何实现递归查询效果)

@ Symbol-MySQL中递归SELECT查询的解决方案?(mysql如何实现递归查询效果)

关于Mysql中的递归SELECT查询有很多问题,但是大多数答案是“ Mysql中没有递归SELECT查询的解决方案”。

其实有一定的解决方案,我想清楚地知道,所以这个问题是可以在(how-to-do-the-cursive-select-query-in-
mysql)中找到的先前问题的以下内容

假设您有此表:

col1 - col2 - col31    -  a   -  55    -  d   -  33    -  k   -  76    -  o   -  22    -  0   -  8

&您想在col1中找到所有连接到值“ 1”的链接,即您要打印出:

1 - a - 55 - d - 33 - k - 7

然后,您可以使用以下简单查询:

select col1, col2, @pv:=col3 as ''col3'' from table1join(select @pv:=1)tmpwhere col1=@pv

好的,但是,如果您的表在col1中有2条记录包含“ 1”,而在col1中有2条记录包含“ 3”,例如:

col1 - col2 - col31    -  a   -  51    -  m   -  95    -  d   -  33    -  k   -  76    -  o   -  23    -  v   -  102    -  0   -  8

然后,当用户在col1中搜索“ 1”时,应显示连接到2“ 1”的所有链接,即应显示以下预期结果:

col1 - col2 - col31    -  a   -  51    -  m   -  95    -  d   -  33    -  k   -  73    -  v   -  10

所以,我的问题是 我们如何修改上面的查询,以便它能像上面的预期结果一样显示所有链接?

编辑: @ Gordon,但是如果我们省略select distinct col1, col2from此查询,则意味着什么,您可以对此进行处理(因为childID增加了,所以我们可以对table1进行排序):

select col1, col2,         @pv:=(case when find_in_set(col3, @pv) then @pv else concat(@pv, '','', col3)                end) as ''col3''  from (select * from table1 order by col1) tb1 join      (select @pv:=''1'') tmp      on find_in_set(col1, @pv) > 0

在这种情况下,我们不必担心顺序,例如,如果这是数据:

col1 - col2 - col34    -  a   -  51    -  d   -  21    -  k   -  42    -  o   -  36    -  k   -  88    -  o   -  9

输出将是:

col1 - col2 - col31    -  d   -  1,21    -  k   -  1,2,42    -  o   -  1,2,4,3

所以我们得到1,2,4,3正确的结果吗?&如果col1在,我们只选择所有记录1,2,4,3。然后,我们可以获得最终的预期结果。

如果是这样,您能想到任何排除我刚才提到的解决方案的特殊情况吗?

答案1

小编典典

我一直在想这样的事情是否行得通:

select distinct col1, col2from (select col1, col2,             @pv:=(case when find_in_set(col3, @pv) then @pv else concat(@pv, '','', col3)                    end) as ''col3''      from table1 join          (select @pv:=''1'') tmp          on find_in_set(col1, @pv) > 0     ) t

这样的事情应该适用于小型数据集。但是,将所有id放入字符串的想法仅限于字符串的容量。

5- MySQL数据库SELECT查询操作

5- MySQL数据库SELECT查询操作

复习:

数据类型:

数值型:整数(int,tinyint,smallint,bigint,mediumint) 浮点型(float ,double,decimal)

字符型:char(固定长度) ,varchar,text.

日期时间,date,time,datetime,timestamp.

创建表:create table表名(列1 type1,列2 type2)

参数:primary key ,not null,default,auto_increment(条件:条件:整型,索引列,每个表只能设置一个)

更新表:alter table 表名     add,modify,change,drop.

删除表:drop table 表名

重命名表:rename table 旧表名 to 新表明

 

MySQL数据库查询条件

select

数据查询

查询结果排序

limit的用法

 

orders:订单表

order_num      order_date         cust_id 

2019-1001      2018-12-12         10001

 

orderitems:

order_num    order_item

 

select查询语句 

MySQL使用select语句查询数据

select语句的作用是从一个或多个表中查询信息。

使用select语句,必须至少给出两条信息:

1.选择什么

2.从什么地方选择

注意:SQL语言中,不区分大小写,每一条SQL语句,使用分号“;”表示结尾。

查询特定列

格式:select 列名 from表名

 

查询所有列

格式:select*from 表名

 

 

查询结果排序

-为了明确的排序用select语句查询出的数据,可使用order by语句。

order by语句取一个或多个列的名字,根据这些列进行排序。

格式:

select 列名 from 表名 order by 列名;

select 列名 from 表名 order by 列名1,列名2;

 

设定返回的行数

-如果一个表的行非常多,可以使用limit关键字,指定需要返回多少行。

-格式1:select列名 from 表名 limit n ,列如:limit3是指前三行。 说明:n是限定的行数;

-select 列名 from 表名 limit n ,m;#只显示从第n行开始的后面m行

-说明:MySQL中的行号是从0开始的,limit2,3是从第三行开始往后数3行,也就是第3,4,5行。

 

database – 在mySQL中优化嵌入式SELECT查询

database – 在mySQL中优化嵌入式SELECT查询

好的,这是我现在正在运行的一个查询,它有45,000条记录,大小为65MB ……并且即将变得越来越大(所以我也要考虑未来的性能):

SELECT count(payment_id) as signup_count,sum(amount) as signup_amount
FROM payments p
WHERE tm_completed BETWEEN '2009-05-01' AND '2009-05-30'
AND completed > 0
AND tm_completed IS NOT NULL
AND member_id NOT IN (SELECT p2.member_id FROM payments p2 WHERE p2.completed=1 AND p2.tm_completed < '2009-05-01' AND p2.tm_completed IS NOT NULL GROUP BY p2.member_id)

正如你可能想象的那样 – 它会让MysqL服务器陷入停顿……

它的作用是 – 它只是提取已注册的新用户数量,至少有一个“已完成”付款,tm_completed不为空(因为它仅填充已完成的付款),以及(成员具有的嵌入式选择)从来没有“完成”付款 – 这意味着他是一个新成员(只是因为系统确实重新发布了等等,这是区分刚刚被重新招募的现有成员和新成员之间的唯一方法第一次).

现在,是否有任何可能的方法来优化此查询以使用更少的资源或其他东西,并停止将我的MysqL资源放在他们的膝盖上……?

我是否遗漏了任何信息以进一步澄清这一点?让我知道…

编辑:

以下是该表上已有的索引:

PRIMARY PRIMARY 46757 payment_id

member_id INDEX 23378 member_id

payer_id INDEX 11689 payer_id

coupon_id INDEX 1 coupon_id

tm_added INDEX 46757 tm_added,product_id

tm_completed INDEX 46757 tm_completed,product_id

最佳答案
这些IN子查询在MysqL中有点慢.我会这样改写:

SELECT COUNT(1) AS signup_count,SUM(amount) AS signup_amount
FROM   payments p
WHERE  tm_completed BETWEEN '2009-05-01' AND '2009-05-30'
AND    completed > 0
AND    NOT EXISTS (
           SELECT member_id
           FROM   payments
           WHERE  member_id = p.member_id
           AND    completed = 1
           AND    tm_completed < '2009-05-01');

检查’tm_completed IS NOT NULL’不是必需的,因为BETWEEN条件暗示了这一点.

还要确保你有一个索引:

(tm_completed,completed)

MSSQL中递归SQL查询语句实例说明-

MSSQL中递归SQL查询语句实例说明-

MSSQL中递归SQL查询语句分享,需要的朋友可以参考下。

一张表(ColumnTable)的结构如下图所示

当前需要实现的功能:通过Number的值为67来获取当前的节点ID、父节点ID

递归实现SQL语句:
代码如下:
with znieyu as
(
select c.Id,c.FatherId,0 as lv1 from ColumnTable c where c.Number=67
union all
select c.Id,c.FatherId,lv1-1 from znieyu z
inner join ColumnTable c
on z.FatherId=c.Id
)
select znieyu.Id ,znieyu.FatherId,znieyu.lv1 as lv from znieyu

实现的效果:

满足条件67ID为6的递归-->6-->2(LV0)-->1(LV-1)-->0(LV-2)
满足条件67ID为8的递归-->8-->5(LV0)-->2(LV-1)-->1(LV-2)-->0(LV-3)
很简单的一个SQL递归,记录下来...

MySQL Select查询

MySQL Select查询

1. 基本语法:

SELECT
{* | <字段列名>}
[
FROM <表 1>, <表 2>…
[WHERE <表达式>
[GROUP BY <group by definition>
[HAVING <expression> [{<operator> <expression>}…]]
[ORDER BY <order by definition>]
[LIMIT[<offset>,] <row count>]
]

 

 1.1 全部查询

SELECT * FROM < 表名 >;

 

1.2 选择指定字段

SELECT <字段名1>,<字段名2>,…,<字段名n> FROM <表名>;

 

1.3 过滤字段中的重复值: DISTINCT

SELECT DISTINCT <字段名> FROM <表名>;

 

1.4 别名 :AS

给很长的表或者字段可以起个别名,用别名进行查询

mysql> select a.id,a.name from user as a;
+----+------+
| id | name |
+----+------+
|  1 | Wang |
+----+------+


mysql> select id as userID from user;
+--------+
| userID |
+--------+
| 1 |
+--------+

 

 1.5 限制查询结果的记录数量:LIMIT

<LIMIT> [<位置偏移量>,] <行数>

“位置偏移量”指从哪一行开始显示,是一个可选参数,如果不指定“位置偏移量”,将会从表中的第一条记录开始(第一条记录的位置偏移量是 0,第二条记录的位置偏移量是 1,以此类推);

第二个参数“行数”指示返回的记录条数。

# 查询从第3+1条记录开始的4条数据。
mysql> SELECT * FROM <表名> LIMIT 3,4;

 

 1.6 排序查询:ORDER BY

ORDER BY {<列名> | <表达式> | <位置>} [ASC|DESC]

ASC 升序
DESC 降序

e.g.

从user中查询所有字段,先按照 balance 字段进行降序排列,再按照 debt 字段升序排序

mysql> select * from user order by balance desc,debt asc;
+----+------+----------+---------+------+
| id | name | password | balance | debt |
+----+------+----------+---------+------+
|  1 | Wang | 1234     |   15000 |    0 |
|  2 | song | 1234     |    3000 |  100 |
|  3 | li   | 1234     |    2000 |    0 |
|  4 | zhao | NULL     |    NULL | NULL |
|  5 | qian | NULL     |    NULL | NULL |
|  6 | sun  | NULL     |    NULL | NULL |
|  9 | NULL | NULL     |    NULL |   70 |
|  8 | NULL | NULL     |    NULL |   80 |
|  7 | Zhou | NULL     |    NULL |   90 |
+----+------+----------+---------+------+

 

 1.7 条件查询: WHERE

WHERE <查询条件> {<判定运算1><判定运算2>,…}

判断条件:
1. >,<,<=,>=,=,<>,!=,<=> # 注:<=> 判断两个数据是否相等,只是可以和 NULL 进行比较,其他方面和 = 没啥差别。
2. [NOT]LIKE
3. IS [NOT] NULL
4. [NOT] BETWEEN ... AND ...
5. [NOT][REGEXP|RLIKE]

单一查询:

mysql> select balance from user where name = ''Wang'';
+---------+
| balance |
+---------+
|   15000 |
+---------+

多条件查询:

mysql> select name,balance from user where balance>=3000 and balance<16000;
+------+---------+
| name | balance |
+------+---------+
| Wang |   15000 |
| song |    3000 |
+------+---------+

1.8 LIKE 模糊查询

<表达式1> [NOT] LIKE <表达式2>

通配符:

1. 百分号:%  : 可以匹配 0 个或多个字符,不匹配 空值。

2. 下划线:_   : 只匹配一个字符。

mysql> select * from user;
+----+------+----------+---------+------+
| id | name | password | balance | debt |
+----+------+----------+---------+------+
|  1 | Wang | 1234     |   15000 |    0 |
|  2 | song | 1234     |    3000 |  100 |
|  3 | li   | 1234     |    2000 |    0 |
|  4 | zhao | NULL     |    NULL | NULL |
|  5 | qian | NULL     |    NULL | NULL |
|  6 | sun  | NULL     |    NULL | NULL |
|  7 | Zhou | NULL     |    NULL |   90 |
|  8 | NULL | NULL     |    NULL |   80 |
|  9 | NULL | NULL     |    NULL |   70 |
+----+------+----------+---------+------+

mysql> select name,debt from user where name like ''%ng'';
+------+------+
| name | debt |
+------+------+
| Wang |    0 |
| song |  100 |
+------+------+

1.9 查询日期

select * from <table> where date<''2019-01-20'';

select * from <table> where date between ''2019-01-20'' and ''2019-10-01'';

 

 2.0 内连接查询

mysql> select * from grade;
+------+--------+
| gid  | record |
+------+--------+
|    1 |    100 |
|    2 |    200 |
|    3 |    400 |
+------+--------+


mysql> select * from user;
+----+------+----------+---------+------+
| id | name | password | balance | debt |
+----+------+----------+---------+------+
|  1 | Wang | 1234     |   15000 |    0 |
|  2 | song | 1234     |    3000 |  100 |
|  3 | li   | 1234     |    2000 |    0 |
|  4 | zhao | NULL     |    NULL | NULL |
|  5 | qian | NULL     |    NULL | NULL |
|  6 | sun  | NULL     |    NULL | NULL |
|  7 | Zhou | NULL     |    NULL |   90 |
|  8 | NULL | NULL     |    NULL |   80 |
|  9 | NULL | NULL     |    NULL |   70 |
+----+------+----------+---------+------+

# 内连接查询 mysql
> select * from user inner join grade where user.id=grade.gid; +----+------+----------+---------+------+------+--------+ | id | name | password | balance | debt | gid | record | +----+------+----------+---------+------+------+--------+ | 1 | Wang | 1234 | 15000 | 0 | 1 | 100 | | 2 | song | 1234 | 3000 | 100 | 2 | 200 | | 3 | li | 1234 | 2000 | 0 | 3 | 400 | +----+------+----------+---------+------+------+--------+
# 不写inner join,默认也是内连接 mysql
> select * from user, grade where user.id=grade.gid; +----+------+----------+---------+------+------+--------+ | id | name | password | balance | debt | gid | record | +----+------+----------+---------+------+------+--------+ | 1 | Wang | 1234 | 15000 | 0 | 1 | 100 | | 2 | song | 1234 | 3000 | 100 | 2 | 200 | | 3 | li | 1234 | 2000 | 0 | 3 | 400 | +----+------+----------+---------+------+------+--------+
# 指定查询哪些字段 mysql
> select user.id,user.name,user.balance,grade.gid from user, grade where user.id=grade.gid; +----+------+---------+------+ | id | name | balance | gid | +----+------+---------+------+ | 1 | Wang | 15000 | 1 | | 2 | song | 3000 | 2 | | 3 | li | 2000 | 3 | +----+------+---------+------+

2.1 外连接

左外连接:

基于左边的表,将右边表中的字段合并过来

mysql> select id,name,record from user left join grade on user.id = grade.gid;
+----+------+--------+
| id | name | record |
+----+------+--------+
|  1 | Wang |    100 |
|  2 | song |    200 |
|  3 | li   |    400 |
|  4 | zhao |   NULL |
|  5 | qian |   NULL |
|  6 | sun  |   NULL |
|  7 | Zhou |   NULL |
|  8 | NULL |   NULL |
|  9 | NULL |   NULL |
+----+------+--------+

右外连接:

mysql> select id,name,record from user right join grade on user.id = grade.gid;
+------+------+--------+
| id   | name | record |
+------+------+--------+
|    1 | Wang |    100 |
|    2 | song |    200 |
|    3 | li   |    400 |
+------+------+--------+

2.2 子查询

 1. IN

<表达式> [NOT] IN <子查询>

此处的子查询只能返回一行数据

2. 比较运算符

<表达式> {= | < | > | >= | <= | <=> | < > | != }
{ ALL | SOME | ANY} <子查询>

3. EXISTS

  判断子查询是否存在,如果存在,True,否则False;

 

IN:

mysql> select * from grade;
+------+--------+
| gid  | record |
+------+--------+
|    1 |    100 |
|    2 |    200 |
|    3 |    400 |
+------+--------+


mysql> select * from user;
+----+------+----------+---------+------+
| id | name | password | balance | debt |
+----+------+----------+---------+------+
|  1 | Wang | 1234     |   15000 |    0 |
|  2 | song | 1234     |    3000 |  100 |
|  3 | li   | 1234     |    2000 |    0 |
|  4 | zhao | NULL     |    NULL | NULL |
|  5 | qian | NULL     |    NULL | NULL |
|  6 | sun  | NULL     |    NULL | NULL |
|  7 | Zhou | NULL     |    NULL |   90 |
|  8 | NULL | NULL     |    NULL |   80 |
|  9 | NULL | NULL     |    NULL |   70 |
+----+------+----------+---------+------+

mysql> select * from user where id in (select gid from grade where gid=2);
+----+------+----------+---------+------+
| id | name | password | balance | debt |
+----+------+----------+---------+------+
|  2 | song | 1234     |    3000 |  100 |
+----+------+----------+---------+------+

EXISTS:

 

mysql> select * from user where exists (select * from grade where gid=1000);
Empty set (0.00 sec)

mysql> select * from user where exists (select * from grade where gid=1);
+----+------+----------+---------+------+
| id | name | password | balance | debt |
+----+------+----------+---------+------+
|  1 | Wang | 1234     |   15000 |    0 |
|  2 | song | 1234     |    3000 |  100 |
|  3 | li   | 1234     |    2000 |    0 |
|  4 | zhao | NULL     |    NULL | NULL |
|  5 | qian | NULL     |    NULL | NULL |
|  6 | sun  | NULL     |    NULL | NULL |
|  7 | Zhou | NULL     |    NULL |   90 |
|  8 | NULL | NULL     |    NULL |   80 |
|  9 | NULL | NULL     |    NULL |   70 |
+----+------+----------+---------+------+

 

 2.3 分组查询

 分组查询查到是每个,相同的数据会合并到一个组里,是看不到的。可以使用聚合函数对每个组的数据进行求和、统计数量等。

mysql> select * from user;
+----+------+----------+---------+------+
| id | name | password | balance | debt |
+----+------+----------+---------+------+
|  1 | Wang | 1234     |   15000 |    0 |
|  2 | song | 1234     |    3000 |  100 |
|  3 | li   | 1234     |    2000 |    0 |
|  4 | zhao | NULL     |    NULL | NULL |
|  5 | qian | NULL     |    NULL | NULL |
|  6 | sun  | NULL     |    NULL | NULL |
|  7 | Zhou | NULL     |    NULL |   90 |
| 10 | Wang | NULL     |   15000 | NULL |
+----+------+----------+---------+------+

# 按照名字分组,查询每个分组的id,name,balance的总和。sum,聚合函数之一。
mysql> select id,name,sum(balance) from user group by name;
+----+------+--------------+
| id | name | sum(balance) |
+----+------+--------------+
|  1 | Wang |        30000 |
|  2 | song |         3000 |
|  3 | li   |         2000 |
|  4 | zhao |         NULL |
|  5 | qian |         NULL |
|  6 | sun  |         NULL |
|  7 | Zhou |         NULL |
+----+------+--------------+

HAVING

having,给分组添加过滤,筛选符合条件的分组

mysql> select count(name) ,name from user group by name having count(name)>1;
+-------------+------+
| count(name) | name |
+-------------+------+
|           2 | Wang |
+-------------+------+

 

 2.4 正则表达式查询:REGEXP

匹配模式

^    匹配开始字符        ''^b''匹配以b开头的字符串

$    匹配结束字符        ''b$''匹配以b结束的字符串

.     匹配任意单个字符      

*    匹配前面的字符0次或多次     a*b 匹配 b、ab、aaaaaaaab

+    匹配前面的字符1次或多次    a+b 匹配 ab、aaaaaab

<字符>  匹配包含的字符        <fa> 匹配 afa,fa,bbbfaccc

[]    匹配内部的任意一个字符   [xyz] 匹配 x 或 y 或 z

[^]     匹配不在括号内的字符    [^1-9] 不匹配 1-9

{n,}   匹配前一个字符最少n次

{n,m}  匹配前一个字符最少n次,最多m次。

 

e.g.

mysql> select * from user where name regexp ''^W'';
+----+------+----------+---------+------+
| id | name | password | balance | debt |
+----+------+----------+---------+------+
|  1 | Wang | 1234     |   15000 |    0 |
| 10 | Wang | NULL     |   15000 | NULL |
+----+------+----------+---------+------+
2 rows in set (0.02 sec)

 

 

 

 

 

今天关于@ Symbol-MySQL中递归SELECT查询的解决方案?mysql如何实现递归查询效果的讲解已经结束,谢谢您的阅读,如果想了解更多关于5- MySQL数据库SELECT查询操作、database – 在mySQL中优化嵌入式SELECT查询、MSSQL中递归SQL查询语句实例说明-、MySQL Select查询的相关知识,请在本站搜索。

本文标签: