not in 三层联查怎么实现
时间: 2024-01-30 22:12:20 浏览: 71
"Not in" 三层联查可以通过以下两种方式实现:
1. 使用子查询:可以先查询出需要排除的数据,然后将其作为子查询,再在主查询中使用 "not in" 对其进行排除。
例如,假设我们需要查询在订单表中没有出现过的产品名称,可以使用以下 SQL 语句:
```
SELECT name
FROM products
WHERE id NOT IN (
SELECT product_id
FROM order_items
)
```
2. 使用左连接:可以使用左连接将需要排除的数据从主查询中排除掉。
例如,假设我们需要查询在订单表中没有出现过的产品名称,可以使用以下 SQL 语句:
```
SELECT products.name
FROM products
LEFT JOIN order_items ON products.id = order_items.product_id
WHERE order_items.product_id IS NULL
```
以上两种方式都可以实现 "not in" 三层联查,具体选择哪种方式取决于具体情况和个人喜好。
相关问题
mybatisplus实现三表联查
Mybatis-plus 实现三表联查可以通过使用 Mybatis-plus 的 Wrapper 来实现。
举个例子,假设我们有三个表:A、B、C,它们之间的关系是 A 与 B 是一对多关系,B 与 C 是多对一关系。现在我们需要查询 A 表中的所有记录,并且关联查询 B 和 C 表中的相应记录。
首先我们需要在 A 对应的实体类中添加 B 和 C 的关联对象:
```java
public class A {
private Long id;
private String name;
private List<B> bs;
private C c;
// getters and setters
}
```
然后我们可以使用 Wrapper 来进行多表联查,具体代码如下:
```java
List<A> result = aMapper.selectList(new QueryWrapper<A>()
.select("a.id", "a.name", "b.id as b_id", "b.name as b_name", "c.id as c_id", "c.name as c_name")
.eq("a.deleted", 0)
.leftJoin("b", "b.a_id = a.id")
.leftJoin("c", "c.id = b.c_id"));
```
上面的代码中,我们使用了 `QueryWrapper` 对象来构建查询条件,使用了 `select` 方法来指定需要查询哪些字段,使用了 `leftJoin` 方法来进行多表关联查询。
需要注意的是,我们在查询 B 和 C 表的字段时,使用了 `as` 关键字来给字段起了别名,这样可以避免查询结果中的字段名冲突。
最后,我们需要在 A 对应的 Mapper 中添加对应的 SQL 方法:
```java
public interface AMapper extends BaseMapper<A> {
List<A> selectList(@Param(Constants.WRAPPER) Wrapper<A> wrapper);
}
```
这样就完成了三表联查的操作。
java js vue 实现三级联查
Java后端代码:
1.定义一个Java类作为数据源,包括省份(province)、城市(city)和区县(county):
```java
public class Area {
private String province;
private String city;
private String county;
public Area(String province, String city, String county) {
this.province = province;
this.city = city;
this.county = county;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCounty() {
return county;
}
public void setCounty(String county) {
this.county = county;
}
}
```
2.定义一个Java类作为数据操作类,实现获取数据的方法:
```java
import java.util.ArrayList;
import java.util.List;
public class AreaData {
public static List<Area> getAreaData() {
List<Area> data = new ArrayList<>();
data.add(new Area("北京市", "北京市", "东城区"));
data.add(new Area("北京市", "北京市", "西城区"));
data.add(new Area("北京市", "北京市", "朝阳区"));
data.add(new Area("北京市", "北京市", "丰台区"));
data.add(new Area("北京市", "北京市", "石景山区"));
data.add(new Area("北京市", "北京市", "海淀区"));
data.add(new Area("北京市", "北京市", "门头沟区"));
data.add(new Area("北京市", "北京市", "房山区"));
data.add(new Area("北京市", "北京市", "通州区"));
data.add(new Area("北京市", "北京市", "顺义区"));
data.add(new Area("北京市", "北京市", "昌平区"));
data.add(new Area("北京市", "北京市", "大兴区"));
data.add(new Area("北京市", "北京市", "怀柔区"));
data.add(new Area("北京市", "北京市", "平谷区"));
data.add(new Area("北京市", "北京市", "密云区"));
data.add(new Area("北京市", "北京市", "延庆区"));
data.add(new Area("天津市", "天津市", "和平区"));
data.add(new Area("天津市", "天津市", "河东区"));
data.add(new Area("天津市", "天津市", "河西区"));
data.add(new Area("天津市", "天津市", "南开区"));
data.add(new Area("天津市", "天津市", "河北区"));
data.add(new Area("天津市", "天津市", "红桥区"));
data.add(new Area("天津市", "天津市", "东丽区"));
data.add(new Area("天津市", "天津市", "西青区"));
data.add(new Area("天津市", "天津市", "津南区"));
data.add(new Area("天津市", "天津市", "北辰区"));
data.add(new Area("天津市", "天津市", "武清区"));
data.add(new Area("天津市", "天津市", "宝坻区"));
data.add(new Area("天津市", "天津市", "滨海新区"));
data.add(new Area("天津市", "天津市", "宁河区"));
data.add(new Area("天津市", "天津市", "静海区"));
data.add(new Area("天津市", "天津市", "蓟州区"));
return data;
}
}
```
3.定义一个Java类作为接口,提供获取数据的方法:
```java
import java.util.List;
public interface AreaService {
List<Area> getAreaData();
}
```
4.实现接口:
```java
import java.util.List;
public class AreaServiceImpl implements AreaService {
@Override
public List<Area> getAreaData() {
return AreaData.getAreaData();
}
}
```
5.使用Spring框架,配置Bean:
```xml
<bean id="areaService" class="com.example.AreaServiceImpl"/>
```
6.使用Spring注入Bean:
```java
@Autowired
private AreaService areaService;
```
7.在Controller中实现获取数据的接口:
```java
@RequestMapping("/getAreaData")
@ResponseBody
public List<Area> getAreaData() {
return areaService.getAreaData();
}
```
Vue前端代码:
1.使用axios插件实现前端请求数据:
```javascript
import axios from 'axios'
export function getAreaData() {
return axios({
url: '/getAreaData',
method: 'get'
})
}
```
2.定义一个vue组件作为三级联动的实现:
```vue
<template>
<div>
<select v-model="province" @change="provinceChange">
<option value="">请选择省份</option>
<option v-for="item in provinceList" :value="item">{{item.province}}</option>
</select>
<select v-model="city" @change="cityChange">
<option value="">请选择城市</option>
<option v-for="item in cityList" :value="item">{{item.city}}</option>
</select>
<select v-model="county">
<option value="">请选择区县</option>
<option v-for="item in countyList" :value="item">{{item.county}}</option>
</select>
</div>
</template>
<script>
import {getAreaData} from '@/api/area'
export default {
name: 'AreaSelect',
data() {
return {
province: '',
city: '',
county: '',
provinceList: [],
cityList: [],
countyList: []
}
},
created() {
getAreaData().then(res => {
this.provinceList = res
})
},
methods: {
provinceChange() {
this.city = ''
this.county = ''
this.cityList = this.province.cityList || []
},
cityChange() {
this.county = ''
this.countyList = this.city.countyList || []
}
}
}
</script>
```
3.在需要使用的页面中使用组件:
```vue
<template>
<div>
<area-select></area-select>
</div>
</template>
<script>
import AreaSelect from '@/components/AreaSelect'
export default {
name: 'Demo',
components: {
AreaSelect
}
}
</script>
```
阅读全文