MySql:如何获得所需的结果

时间:2020-05-14 16:36:44

标签: mysql

我有一张这样的桌子:

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
)

但是我得到了所有数据

2 个答案:

答案 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
相关问题