Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 查询以获取依赖于另一列的数据,但仅当该列出现一次时_Mysql_Select - Fatal编程技术网

Mysql 查询以获取依赖于另一列的数据,但仅当该列出现一次时

Mysql 查询以获取依赖于另一列的数据,但仅当该列出现一次时,mysql,select,Mysql,Select,我有一个MySQL表,如下所示: +--------------------------------------------+ | ID | State | Name | City | +--------------------------------------------+ | PA1 | PA | Foo | Philly | | VA1 | PA | Foo | Philly

我有一个MySQL表,如下所示:

+--------------------------------------------+
|  ID  |  State   |  Name   |     City       |
+--------------------------------------------+
|  PA1 |  PA      |  Foo    |    Philly      |
|  VA1 |  PA      |  Foo    |    Philly      |
|  DC1 |  VA      |  Foobar |  Washington    |
|  ME2 |  ME      |  Barfoo |   Portland     |
+--------------------------------------------+
现在,我想做一个SELECT语句,其中我只选择那些
State=SUBSTR(ID,1,2)
的行,除非
名称只在表中出现一次。换句话说,我想以下表结束:

+--------------------------------------------+
|  ID  |  State   |  Name   |     City       |
+--------------------------------------------+
|  PA1 |  PA      |  Foo    |    Philly      |
|  DC1 |  VA      |  Foobar |  Washington    |
|  ME2 |  ME      |  Barfoo |   Portland     |
+--------------------------------------------+
在第二行中,State不等于ID的子字符串,并且该'Name'(在本例中为Foo)在表中多次出现,因此我们不获取该行。然而,我还想要第三行,即使State再次不等于ID的子字符串,因为“Name”在原始表中只出现一次


关于我可以使用什么查询来实现这一点,有什么想法吗?我已经玩了很长一段时间没有成功。谢谢

您可以在
WHERE
子句中的
EXISTS
中使用以下内容:

select *
from   myTable
where  State = SUBSTR(ID, 1, 2) or
       Name in (select Name from myTable group by Name having count(*)=1)
select *
from yourtable t1
where state = SUBSTR(ID, 1, 2)
  or exists (select count(Name) CountName, Name
              from yourtable t2
              where t1.name = t2.name
              group by Name
              having count(name) = 1)

返回结果:

|  ID | STATE |   NAME |       CITY |
-------------------------------------
| PA1 |    PA |    Foo |     Philly |
| DC1 |    VA | Foobar | Washington |
| ME2 |    ME | Barfoo |   Portland |

取决于,OP首先声明“仅那些State=SUBSTR(ID,1,2)的行,除非名称只在表中出现一次”,然后声明“在表中出现多次,因此我们无法获得该行”。我不完全清楚什么是合适的,但无论哪种方法都可以使用
have
subquery@paul我指的是
,如果解释不清楚,我很抱歉。不管怎样,我都成功了,谢谢@paul我将您的答案更新为使用
,否则这不起作用,成为SQL Fiddle的公认答案+1毫无意义,尽管我选择了另一个答案,只是因为它对我很有效,而且来得稍微早一点。