【问题标题】:How to only SELECT data if a specific record is not exist如果特定记录不存在,如何仅选择数据
【发布时间】:2021-04-27 03:27:31
【问题描述】:

如果 MySQL 的同一个表中存在特定记录,我正在尝试显示多个带有条件的数据并跳过行。

这是表格的示例

table_a

|      id     |     bi_id    |     status     |
|-------------|--------------|----------------|
|          1  |         111  |process1        |
|          2  |         112  |process1        |
|          3  |         112  |process2        |
|          4  |         113  |process1        |
|          5  |         111  |process2        |
|          6  |         111  |done            |
|          7  |         112  |done            |

我正在使用下面的这个查询来选择状态为“完成”的最后一个 ID

SELECT MAX(id) FROM table_a WHERE status="done" GROUP BY bi_id

斗争是我想显示状态不是“完成”的最后一个 ID,如果存在状态为“完成”的 bi_id,则不要选择最大 ID,如下表所示。

预期结果:

------------------
|    max(id)     |
|----------------|
|       4        |

我最后一次尝试是使用这个查询,但你知道这行不通。我也尝试过使用 NOT EXIST 进行查询,但也不工作。

SELECT MAX(id)
FROM   table_a
WHERE status != "done" NOT IN
     (SELECT id
     FROM   table_a
     WHERE  status = "done" GROUP BY bi_id) GROUP BY by_id

是否有任何解决方法可以通过 MySQL 查询或 php/codeigniter 来实现? 感谢和抱歉英语不好。

【问题讨论】:

  • 您的预期结果是什么?
  • 如果有的话,你会遇到什么错误?您的预期结果是什么?
  • 我正在尝试获取状态不是“完成”的最大 id,如果 bi_id 具有“完成”状态则跳过行。我已经编辑了我的问题并添加了预期的表格结果。
  • @MohammadFahadRao 我没有遇到任何错误,只是结果不是我所期望的。我的预期结果是获得最后一个 id,其中 bi_id 不包含任何“完成”状态。
  • 为什么只选择id=3?对于bi_id=112,如果 ids 是 2-3-7,则链是 3,这很清楚...但是 bi_id=111 的同一链是 1-5-6,为什么 id=5 不是选择了吗?

标签: php mysql codeigniter


【解决方案1】:

试试这个查询:

SELECT MAX(`id`)
FROM `table_a`
WHERE `status` != 'done'
AND `bi_id` NOT IN (
  SELECT `t2`.`bi_id`
  FROM `table_a` AS `t2`
  WHERE `t2`.`status` = 'done'
);

通过这种方式,您可以排除带有bi_idstatus = 'done' 的行。 你可以在这个DBFiddle看到结果。

【讨论】:

  • 哦,就是这样,在查询末尾添加bi_id 组将对我有用。我想需要了解更多信息:/ 无论如何感谢先生的帮助,感谢它。
【解决方案2】:

你可以这么简单地做一个查询:

SELECT MAX(id)
 FROM table_a
 GROUP BY bi_id
HAVING GROUP_CONCAT(status) NOT LIKE '%done%'

在上面的查询示例中,我使用了GROUP BYGROUP_CONCAT() 函数。基本上,我对查询所做的是:

SELECT bi_id, GROUP_CONCAT(status), MAX(id) 
 FROM table_a
 GROUP BY bi_id;

哪个会返回:

+-------+------------------------+---------+
| bi_id | GROUP_CONCAT(status)   | MAX(id) |
+-------+------------------------+---------+
| 111   | process1,process2,done |    6    |
| 112   | process1,process2,done |    7    |
| 113   | process1               |    4    |
| 114   | process2,process1      |   10    |
+--------------------------------+---------+

如您所见,111 & 112bi_id 包含 GROUP_CONCAT(status) 的结果,其中包含 done。因此,在查询HAVING GROUP_CONCAT(status) LIKE '%done%'时,这两个被过滤掉了。

Demo fiddle

P/S:考虑到最后一条评论,我在示例(8,114,'process2'), (10,114,'process1') 中添加了另外两行。

【讨论】:

    猜你喜欢
    • 2017-11-06
    • 2012-02-11
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多