使用SELECT查找特定数据

问题描述

MysqL-使用SELECT查找特定数据

我正在寻找一种方法,可以执行一些SELECT并仅从数据库中返回特定数据,这是数据的示例:

+----+------+--------+--------+--------+
| ID | name | value1 | value2 | value3 |
+----+------+--------+--------+--------+
|  1 | aaaa | aaaa   | Yes    | True   |
|  2 | aaaa | bbbb   | Yes    | False  |
|  3 | aaaa | cccc   | Yes    | True   |
|  4 | aaaa | dddd   | Yes    | False  |
|  5 | aaaa | eeee   | Yes    | False  |
|  6 | bbbb | NULL   | Yes    | True   |
|  7 | bbbb | NULL   | Yes    | False  |
|  8 | bbbb | NULL   | Yes    | True   |
|  9 | bbbb | NULL   | Yes    | False  |
| 10 | cccc | ffff   | No     | True   |
| 11 | cccc | ffff   | No     | False  |
| 12 | cccc | ffff   | No     | True   |
| 13 | cccc | ffff   | No     | False  |
| 14 | cccc | gggg   | Yes    | True   |
| 15 | cccc | gggg   | Yes    | False  |
| 16 | cccc | gggg   | Yes    | True   |
| 17 | cccc | gggg   | Yes    | False  |
+----+------+--------+--------+--------+

这是我期望的结果:

结果1(第一次选择):

+----+------+--------+--------+--------+
| ID | name | value1 | value2 | value3 |
+----+------+--------+--------+--------+
|  1 | aaaa | aaaa   | Yes    | True   |
|  2 | aaaa | bbbb   | Yes    | False  |
|  3 | aaaa | cccc   | Yes    | True   |
|  4 | aaaa | dddd   | Yes    | False  |
|  5 | aaaa | eeee   | Yes    | False  |
|  6 | bbbb | NULL   | Yes    | True   |
| 10 | cccc | ffff   | No     | True   |
| 14 | cccc | gggg   | Yes    | True   |
+----+------+--------+--------+--------+

注意:

  • 列名结果必须遵循以下限制:

    • 名称必须唯一,除非:
      • 还有另一个具有不同value1的name条目,在这种情况下,必须返回所有不同的name / value1组合(通常以ID 1、2、3、4、5、6、10、14显示在表中,由于该限制,ID 7、8、9、11、12、13、15、16、17不在结果中。
  • 列value1的结果必须遵循以下限制:

    • value1必须返回所有不同的value1条目(根据名称限制),但是不能重复(在表中ID为10、11、12、13、14、15、16、17的大多数情况下显示) ,由于该限制,ID 11、12、13、15、15、16、17不在结果中。
  • 列value2的结果没有限制。

结果2(第二个SELECT):

+----+------+--------+--------+--------+
| ID | name | value1 | value2 | value3 |
+----+------+--------+--------+--------+
|  1 | aaaa | aaaa   | Yes    | True   |
|  3 | aaaa | cccc   | Yes    | True   |
|  6 | bbbb | NULL   | Yes    | True   |
| 10 | cccc | ffff   | No     | True   |
| 14 | cccc | gggg   | Yes    | True   |
+----+------+--------+--------+--------+

注意:

  • 列名结果必须遵循以下限制:

    • 名称必须唯一,除非:
      • 还有另一个具有不同value1的name条目,在这种情况下,必须返回所有不同的name / value1组合(通常以ID 1、2、3、4、5、6、10、14显示在表中,由于该限制,ID 7、8、9、11、12、13、15、16、17不在结果中。
  • 列value1的结果必须遵循以下限制:

    • value1必须返回所有不同的value1条目(根据名称限制),但是不能重复(在表中ID为10、11、12、13、14、15、16、17的大多数情况下显示) ,由于该限制,ID 11、12、13、15、15、16、17不在结果中。
  • 列value2的结果没有限制。

  • 列value3的结果必须遵循以下限制:

    • value3必须为TRUE。

不幸的是,在我自己使用disTINCT进行SELECT的一些测试之后,我再也没有办法解决这个问题了,有人可以帮我解决这个问题吗?

测试1:

select distinct name
from table1

评论: 不考虑value1的限制。

测试2:

SELECT r.name,(SELECT COUNT(disTINCT t2.id)
        FROM table1 t2
        WHERE t2.value1 <> ''
       ) as cnt
FROM (SELECT table1.name FROM table1) r;

评论: 不考虑value1的限制。我试图用count来查看返回结果的数量,我的生产环境有14000左右行。

我不是您可能猜到的MysqL专家。

感谢您的时间和帮助,非常感谢。

编辑:为了清楚起见,我更改了value2中的列值,并完全重写了notes部分。

解决方法

结果1:

SELECT 
   ID,name,value1,value2,CASE value3 WHEN 0 THEN 'False' ELSE 'True' END as value3
FROM specificData
WHERE value2 IS NULL or value2 ='aaaa';

reault1的输出(基于您的输入数据):

+------+------+--------+--------+--------+
| ID   | name | value1 | value2 | value3 |
+------+------+--------+--------+--------+
|    1 | aaaa | aaaa   | NULL   | True   |
|    2 | aaaa | bbbb   | NULL   | False  |
|    3 | aaaa | cccc   | NULL   | True   |
|    4 | aaaa | dddd   | NULL   | False  |
|    5 | aaaa | eeee   | NULL   | False  |
|    6 | bbbb | NULL   | aaaa   | True   |
|   10 | cccc | aaaa   | aaaa   | True   |
|   14 | cccc | bbbb   | aaaa   | True   |
+------+------+--------+--------+--------+

结果2:

SELECT 
   ID,CASE value3 WHEN 0 THEN 'False' ELSE 'True' END as value3
FROM specificData
WHERE (value2 IS NULL or value2 ='aaaa') 
  AND value3;
  

result2的输出(基于您的输入数据)

+------+------+--------+--------+--------+
| ID   | name | value1 | value2 | value3 |
+------+------+--------+--------+--------+
|    1 | aaaa | aaaa   | NULL   | True   |
|    3 | aaaa | cccc   | NULL   | True   |
|    6 | bbbb | NULL   | aaaa   | True   |
|   10 | cccc | aaaa   | aaaa   | True   |
|   14 | cccc | bbbb   | aaaa   | True   |
+------+------+--------+--------+--------+

免责声明: 尽管以上结果符合期望的输出,但不能保证查询是您所需要的!这是因为描述非常不清楚。

最后一个脚本来生成您的测试数据(如果其他人需要此?):

CREATE TABLE specificData (ID INTEGER,name VARCHAR(10),value1 VARCHAR(10),value2 VARCHAR(10),value3 Boolean);
INSERT INTO specificData VALUES 
(1,'aaaa',NULL,True),(2,'bbbb',False),(3,'cccc',(4,'dddd',(5,'eeee',(6,(7,(8,(9,(10,(11,(12,(13,(14,(15,(16,(17,False);