MYSQL4个表,两对父子表。查询显示不正确,请问关联查询如何实现

MYSQL4个表,两对父子表。查询显示不正确,请问关联查询如何实现,第1张

关联查询要求各表间有关联字段才可以,然后在where条件中加上各联字段的相等匹配条件,如:

where aDLMNo=bDLMNo and aDLMNo=cDLMNo and aDLMNo=dDLMNo

看你的意思行号就是显示顺序号,你的查询结果可以按id升序排序(order by id),这样查询结果的顺序就是显示的顺序,这个行号可以在程序里加上,不用在数据库 *** 作。另外最好是加上一个排序值得字段,这样可以随时调整显示顺序。

select Apid as 编号,Aname as 州,B国家,pid

from A

inner join

(select id,name as 国家,pid form A where pid ==0) B --筛选出国家的行,在连接

on Apid =Bpid

where Apid = '0'

试下这个可以吗?把A替换成表名,B不管

参考来源: >

在sql语言里"存在"exists子句是非常不好理解的。

exists子句有两种用法,一种为独立exists子查询,另一种是父子关联子查询。前者对父查询不构成筛选作用,子查询若果有记录存在的话则输出所有的父查询记录集,反之则父查询输出空记录集。后者会对父查询构成筛选作用,不使用not关键字的情况下输出父查询中与子查询的交集,而使用not时则输出父查询中与子查询的非交集。至于如何判断exists子查询属于独立还是父子关联查询,以及为什么父子关联exists子查询会对父查询构成筛选作用,解释起来需要很大的篇幅这里就不讲了。反正我们记住父子关联查询的最常用功能就是它可以求出两张表的交集或非交集(使用not关键字)和不使用group分组的情况下求出某张表的最大值或最小值。

现在回到题主的具体问题上,这个问题涉及到三张表,学生表student、选课表sc、课程表course。

提问要求列出选取了所有课程的学生名单。

下面是提问中给出的sql语句:

select sname from student

where not exists(

select from course

where not exists(

select from sc

where sno=studentsno

and cno=coursecno));

从该语句我们看到它使用了两个嵌套父子关联不存在判断not exists子句,显然是要通过求非交集的方法查出选修了所有课程的学生名单。

一个学生如果他至少有一门课程没有选修,那么他在课程表里就会存在与选课表的非交集,我们姑且称之为“未选所有课程学生名单子集”,它由内层的not exists选出

select from course

where not exists(

select from sc

sno=studentsno

and cno=coursecno)

这个内层父子关联存在子查询选出课程表里与选课表的非交集,最内层选课表sc的课程号cno、学号sno分别与第二层父表course课程的cno、最外层父表studen学生表的sno进行对等连接,不存在对等的记录即为非交集,从而筛选出“未选所有课程学生名单子集”。

未完待续

我不知道原因

但是可以告诉你一个调试的办法

create table test as

SELECT ,if(org_ 。。。。ORDER BY `saler_back_local_rate` asc ;

你把你的sql 语句查出来的结果 建一个表 test

然后 在

select from test limit 0,10;

select from test limit 11,20;

你直接看查出来的分页数据有没有问题

要构建的无限分类的模型 电子产品是最大的分类家用电器 ,数码产品是其子分类可以看到子分类是被父分类包含起来的每个分类都有左右 两个节点编号分别是1、2、3

根据上面的图mysql中建立表和插入数据

CREATE TABLE  `product_categories` (

`id` MEDIUMINT( 8 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,`name` VARCHAR( 20 ) NOT NULL ,

`left_node` MEDIUMINT( 8 ) NOT NULL ,

`right_node` MEDIUMINT( 8 ) NOT NULL

) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;INSERT INTO `product_categories` (`id`, `name`, `left_node`, `right_node`) VALUES(1, '电子产品', 1, 20),

(2, '家用电器', 2, 9),

(3, '电视机', 3, 4),

(4, '电冰箱', 5, 6),

(5, '空调', 7, 8),

(6, '数码产品', 10, 19),

(7, '电脑', 11, 18),

(8, '台式电脑', 12, 13),

(9, '笔记本电脑', 14, 15),

(10, '平板电脑', 16, 17);

表结构如下:

下面是PHP的实例代码:

1、获取所有节点

<php

$pdo = new PDO(

'mysql:host=localhost;dbname=test',

'root',

''

);

$pdo->exec("SET NAMES UTF8");

$stmt = $pdo->prepare("SELECT cname FROM product_categories as c, product_categories as pWHERE cleft_node BETWEEN pleft_node AND pright_nodeAND pname='电子产品' ORDER BY cleft_node");$stmt->execute();

$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);

foreach($rs as $v){

echo $v['name']'<br />';

}

输出:

电子产品

家用电器

电视机

电冰箱

空调

数码产品

电脑

台式电脑

笔记本电脑

平板电脑

2、 获取某个父节点以及其所有子节点

<php

$pdo = new PDO(

'mysql:host=localhost;dbname=test',

'root',

''

);

$pdo->exec("SET NAMES UTF8");

$stmt = $pdo->prepare("SELECT cname FROM product_categories as c, product_categories as pWHERE cleft_node BETWEEN pleft_node AND pright_nodeAND pname='数码产品' ORDER BY cleft_node");$stmt->execute();

$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);

foreach($rs as $v){

echo $v['name']'<br />';

}

输出:

数码产品

电脑

台式电脑

笔记本电脑

平板电脑

3、获取所有的叶子节点

<php

$pdo = new PDO(

'mysql:host=localhost;dbname=test',

'root',

''

);

$pdo->exec("SET NAMES UTF8");

$stmt = $pdo->prepare("SELECT name FROM product_categories where right_node-left_node=1");$stmt->execute();

$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);

foreach($rs as $v){

echo $v['name']'<br />';

}

输出:

电视机

电冰箱

空调

台式电脑

笔记本电脑

平板电脑

4、获取某个子节点及其所有父节点

<php

$pdo = new PDO(

'mysql:host=localhost;dbname=test',

'root',

''

);

$pdo->exec("SET NAMES UTF8");

$stmt = $pdo->prepare("SELECT pname FROM product_categories AS c, product_categories AS p WHERE cleft_node BETWEEN pleft_node AND pright_node AND cname = '平板电脑' ORDER BY pleft_node");$stmt->execute();

$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);

foreach($rs as $v){

echo $v['name']'<br />';

}

输出:

电子产品

数码产品

电脑

平板电脑

5、获取所有节点极其所处的层级

<php

$pdo = new PDO(

'mysql:host=localhost;dbname=test',

'root',

''

);

$pdo->exec("SET NAMES UTF8");

$stmt = $pdo->prepare("SELECT cname, (COUNT(pname) - 1) AS level FROM product_categories AS c, product_categories AS p WHERE cleft_node BETWEEN pleft_node AND pright_node GROUP BY cname ORDER BY cleft_node");$stmt->execute();

$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);

var_dump($rs);

echo '<br />';

foreach($rs as $v){

echo $v['name']' level:'$v['level']'<br />';}

输出:

电子产品 level:0

家用电器 level:1

电视机 level:2

电冰箱 level:2

空调 level:2

数码产品 level:2

电脑 level:2

台式电脑 level:3

笔记本电脑 level:3

平板电脑 level:3

6、获取某个节点的层级

<php

$pdo = new PDO(

'mysql:host=localhost;dbname=test',

'root',

''

);

$pdo->exec("SET NAMES UTF8");

$stmt = $pdo->prepare("SELECT cname, (COUNT(pname) - 1) AS level FROM product_categories AS c, product_categories AS p WHERE cleft_node BETWEEN pleft_node AND pright_node and cname='平板电脑' GROUP BY cname ORDER BY cleft_node");$stmt->execute();

$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);

var_dump($rs);

echo '<br />';

foreach($rs as $v){

echo $v['name']' level:'$v['level']'<br />';}

输出:

平板电脑 level:3

7、在某个节点后平行的插入一个节点

<php

$pdo = new PDO(

'mysql:host=localhost;dbname=test',

'root',

''

);

$pdo->exec("SET NAMES UTF8");

function addNode($left_node,$new_node){

global $pdo;

$stmt = $pdo->prepare("SELECT right_node FROM product_categories WHERE name = '$left_node'");$stmt->execute();

$rs=$stmt->fetch(PDO::FETCH_ASSOC);

$right_node=$rs['right_node'];

$pdo->exec("UPDATE product_categories SET right_node = right_node + 2 WHERE right_node > $right_node");$pdo->exec("UPDATE product_categories SET left_node = left_node + 2 WHERE left_node > $right_node");$pdo->exec("INSERT INTO product_categories(name, left_node, right_node) VALUES('$new_node', $right_node + 1, $right_node + 2)");}

addNode('家用电器','办公用品');

完成之后表结构如下:

8、删除某个节点及其所有子节点

<php

$pdo = new PDO(

'mysql:host=localhost;dbname=test',

'root',

''

);

$pdo->exec("SET NAMES UTF8");

function deleteNode($node_name){

global $pdo;

$stmt = $pdo->prepare("SELECT left_node,right_node, right_node - left_node + 1 as width FROM product_categories WHERE name ='$node_name'");$stmt->execute();

$rs=$stmt->fetch(PDO::FETCH_ASSOC);

$left_node=$rs['left_node'];

$right_node=$rs['right_node'];

$width=$rs['width'];

$pdo->exec("DELETE FROM product_categories WHERE left_node BETWEEN $left_node AND $right_node");$pdo->exec("UPDATE product_categories SET right_node = right_node - $width WHERE right_node > $right_node");$pdo->exec("UPDATE product_categories SET left_node = left_node - $width WHERE left_node > $right_node");}

deleteNode('数码产品');

完成之后表结构如下:

可以看到用多叉树的方式构建无限分类,查询的时候是非常简便的但是在插入新的节点和删除节点时就比较麻烦了

以上就是关于MYSQL4个表,两对父子表。查询显示不正确,请问关联查询如何实现全部的内容,包括:MYSQL4个表,两对父子表。查询显示不正确,请问关联查询如何实现、mysql获取查询结果的行号、MySQL的一张表中有父ID和子ID,等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9604185.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存