多表查询——where中一张字段不为null,并且不在另外一张表中被指向(不被外键指了)

9 篇文章 0 订阅
3 篇文章 0 订阅

我想要知道父表中的记录,有没有被子表中的外键指向。

父表建表语句:

CREATE TABLE tb_super_specialist(super_id integer primary key, super_name varchar(10), super_hospital integer, super_infor TEXT,  foreign key(super_hospital) references tb_hospital(hospital_id) on delete cascade )

子表建表语句:

CREATE TABLE tb_specialist(specialist_id integer primary key, specialist_name varchar(10), specialist_super integer, specialist_infor TEXT)


初始化父表:

insert into tb_super_specialist(super_id,super_name,super_hospital,super_infor) values(1,"内科",1,"我是内科的infor");
insert into tb_super_specialist(super_id,super_name,super_hospital,super_infor) values(2,"内科",1,"null");
insert into tb_super_specialist(super_id,super_name,super_hospital,super_infor) values(3,"外科",1,"我是外科");
insert into tb_super_specialist(super_id,super_name,super_hospital,super_infor) values(4,"外科",1,"我是外科");
insert into tb_super_specialist(super_id,super_name,super_hospital,super_infor) values(5,"内科",1,"我是内科的infor");
insert into tb_super_specialist(super_id,super_name,super_hospital,super_infor) values(6,"外科",1,"null");

初始化子表:

insert into tb_specialist(specialist_id,specialist_name,specialist_super,specialist_infor) values(1,"神经内科",3,"神经内科的infor");
insert into tb_specialist(specialist_id,specialist_name,specialist_super,specialist_infor) values(2,"神经内科",5,"神经内科的infor");
insert into tb_specialist(specialist_id,specialist_name,specialist_super,specialist_infor) values(3,"神经内科",2,"神经内科的infor");
insert into tb_specialist(specialist_id,specialist_name,specialist_super,specialist_infor) values(4,"神经内科",6,"神经内科的infor");

 


接下来,我想要知道,在父表中没有被子表外键关系的,且super_infor字段不为null的记录,查询语句:

select super_id,super_hospital,super_infor,super_name from tb_super_specialist 
where super_infor != "null"  and super_id not in  (select distinct specialist_super from tb_specialist);!这才是重点

主要是not in关键字的使用



参考:http://www.w3school.com.cn/sql/sql_distinct.asp

参考:http://www.w3school.com.cn/sql/sql_in.asp

参考:http://www.iteao.com/html/webkaifa/Sql/1178819.html


In:等值连接,用来查找多表相同字段的记录

Not In:非等值连接,用来查找不存在的记录

Inner join:内连接,主要用来查找都符合条件的记录

Left join:左连接,主要用来查找左边有,右边没有的用空值表达

Right join:右连接,主要用来查找右边有,左边没有的用空值表达

Order By:升序 Asc 降序 Desc

Group By:分组排序 按字段分组(如按班级分),使用的都要有集合函数存在

Having:对分组条件进行判断,使用都要确保每个字段都要用集合函数

COMPUTE BY:子句使您得以用同一 SELECT 语句既查看明细行,又查看汇总行,可以计算子组的汇总值,也可以计算整个结果集的汇总值,行聚合函数名称;例如,SUM、AVG、MIN、MAX 或 COUNT


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设你正在使用 PHP 和 MySQL 数据库进行编程,以下是实现下拉框查询数据库字段并且一个字段只能被一个用户选择的代码示例: 首先,在数据库创建一个用户表(user_table)和一个字段表(field_table),其字段表中包含一个名为 user_id 的外键指向用户表的主键 id。这样可以确保每个字段只能被一个用户选择。 接下来,在 HTML 页面上创建一个下拉框,用于选择字段: ``` <form method="post"> <select name="field"> <option value="">请选择一个字段</option> <?php // 连接数据库 $conn = mysqli_connect("localhost", "username", "password", "database_name"); // 查询所有可用的字段 $query = "SELECT * FROM field_table WHERE user_id IS NULL"; $result = mysqli_query($conn, $query); // 将每个字段添加为选项 while ($row = mysqli_fetch_assoc($result)) { echo "<option value=\"" . $row["id"] . "\">" . $row["name"] . "</option>"; } // 关闭数据库连接 mysqli_close($conn); ?> </select> <input type="submit" value="提交"> </form> ``` 这将显示一个下拉框,其包含所有可用的字段。如果用户选择一个字段并提交表单,将会在后台使用 PHP 代码将该字段与当前用户关联起来: ``` <?php // 连接数据库 $conn = mysqli_connect("localhost", "username", "password", "database_name"); // 检查用户是否选择了一个字段 if (isset($_POST["field"]) && !empty($_POST["field"])) { $field_id = $_POST["field"]; // 查询字段是否已被其他用户选择 $query = "SELECT user_id FROM field_table WHERE id = $field_id"; $result = mysqli_query($conn, $query); $row = mysqli_fetch_assoc($result); // 如果字段未被选择,则将其与当前用户关联 if (!$row["user_id"]) { $user_id = 1; // 替换为当前用户的 ID $query = "UPDATE field_table SET user_id = $user_id WHERE id = $field_id"; mysqli_query($conn, $query); echo "选择成功!"; } else { echo "该字段已被其他用户选择,请选择另一个字段。"; } } else { echo "请选择一个字段。"; } // 关闭数据库连接 mysqli_close($conn); ?> ``` 这将检查用户是否选择了一个字段,如果选择了,则查询该字段是否已被其他用户选择。如果该字段未被选择,则将其与当前用户关联,并显示“选择成功!”消息。否则,将显示“该字段已被其他用户选择,请选择另一个字段。”消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值