我有一张这样的桌子:
CREATE TABLE `base_build_floor` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`build_no` varchar(64) NOT NULL,
`build_name` varchar(64) DEFAULT NULL,
`floor_no` varchar(64) DEFAULT NULL,
`floor_name` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`)
)
并插入一些数据:
INSERT INTO `base_build_floor` VALUES ('41', 'BUILD40210011', 'A', null, null);
INSERT INTO `base_build_floor` VALUES ('42', 'BUILD40210012', 'B', null, null);
INSERT INTO `base_build_floor` VALUES ('43', 'BUILD40210013', 'C', null, null);
INSERT INTO `base_build_floor` VALUES ('44', 'BUILD40210013', 'C', 'FLOOR40210002', 'C1');
INSERT INTO `base_build_floor` VALUES ('45', 'BUILD40210013', 'C', 'FLOOR40210003', 'C2');
INSERT INTO `base_build_floor` VALUES ('46', 'BUILD40210012', 'B', 'FLOOR40210004', 'B1');
桌子是关于建筑地板的桌子,首先您应该建造一座建筑物,然后,一座建筑物可以没有楼层。 A楼没有楼层,B楼有一层B1,C楼有两层C1和C2,我想得到如下结果:
41 BUILD40210011 A null null
44 BUILD40210013 C FLOOR40210002 C1
45 BUILD40210013 C FLOOR40210003 C2
46 BUILD40210012 B FLOOR40210004 B1
这意味着,如果一栋建筑物没有楼层,那么就可以得到它;而如果一栋建筑物没有任何楼层,则不应该获得该建筑物本身,那么如何编写mysql?不起作用
我已经尝试过:
SELECT
b.*
FROM
base_build_floor b
WHERE
b.floor_no IS NOT NULL
OR (
b.floor_no IS NULL
AND b.build_no NOT IN (
SELECT
GROUP_CONCAT(nostr)
FROM
(
SELECT
concat("'", f.build_no, "'") as nostr
FROM
base_build_floor f
WHERE
f.floor_no IS NOT NULL
GROUP BY
f.build_no
) t
)
)
但是我得到了所有数据
答案 0 :(得分:2)
使用Boolean error;
error = false
@TargetApi(android.os.Build.VERSION_CODES.M)
@Override
public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {
// Redirect to deprecated method, so you can use it in all SDK versions
try {
mWebView.stopLoading();
} catch (Exception e) {
e.printStackTrace();
}
showError();
error = true;
}
private void showError(){
Snackbar snackbar = Snackbar.make(coordinatorLayout, "Please check your internet connection.", Snackbar.LENGTH_INDEFINITE)
.setAction("RETRY", new View.OnClickListener() {
@Override
public void onClick(View view) {
if(!error){
mWebView.reload();
} else {
showError();
}
}
});
snackbar.show();
}
});
@Override
public void onRefresh() {
if(!error){
mWebView.reload();
} else {
swipeRefreshLayout.setRefreshing(false);
}
} //
:
NOT EXISTS
请参见demo。
结果:
select t.* from base_build_floor t
where t.floor_no is not null
or not exists (
select 1 from base_build_floor
where build_no = t.build_no and floor_no is not null
)
答案 1 :(得分:0)
如果您有规范化的表,此查询将简单得多。理想情况下,您将有一个包含建筑物ID,编号和名称的建筑物表,以及一个具有建筑物ID,编号和楼层名称的楼层表。然后,您可以将两个表连接在一起。既然不是这种情况,我们基本上可以从主表中提取出建筑物和楼层子表,并像这样将它们联接起来:
SELECT
b.build_no,
b.build_name,
f.floor_no,
f.floor_name
FROM
(SELECT DISTINCT build_no, build_name
FROM base_build_floor) b
LEFT OUTER JOIN
(SELECT *
FROM base_build_floor
WHERE floor_no IS NOT NULL) f ON b.build_no = f.build_no