Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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 - Fatal编程技术网

MySQL:仅当客户同时拥有储蓄账户和支票账户时,才尝试查询客户信息

MySQL:仅当客户同时拥有储蓄账户和支票账户时,才尝试查询客户信息,mysql,Mysql,下表为示例: create table client (gid bigint(3), cid bigint(3)); insert into client values (0, 1); insert into client values (1, 2); insert into client values (2, 3); create table balance(gid bigint(3), bid bigint(3)), type varchar(10)); insert into balan

下表为示例:

create table client (gid bigint(3), cid bigint(3));
insert into client values (0, 1);
insert into client values (1, 2);
insert into client values (2, 3);

create table balance(gid bigint(3), bid bigint(3)), type varchar(10));
insert into balance values (0, 1, 'checking');
insert into balance values (1, 2, 'savings');
insert into balance values (2, 3, 'checking');
insert into balance values (2, 4, 'savings');
insert into balance values (2, 5, 'checking');
客户表包含普通账户和客户id。余额表包含具有账户类型的普通账户和余额id。对于每个通用id,可以有许多客户机,对于每个通用id,可以有许多余额

我想知道的是,如何编写一条select语句,将两个表合并为一个表,然后只返回同时具有支票帐户和储蓄帐户的客户机ID

基德 cid 投标 类型 2. 3. 3. 检查 2. 3. 4. 储蓄 2. 3. 5. 检查
您可以使用
GROUP BY
HAVING
查找
gid
值,该值在
balance
表中有两个条目。查询可以如下所示:

SELECT
    gid
FROM
    balance
GROUP BY
    gid
HAVING
    COUNT(*) = 2;
SELECT
    b.gid,
    c.cid,
    b.bid,
    b.type
FROM
    balance b
JOIN
    client c ON b.gid = c.gid
WHERE
    b.gid IN (SELECT
                  gid
              FROM
                  balance
              GROUP BY
                  gid
              HAVING
                  COUNT(*) = 2);
这将产生以下结果:

+------+
| gid  |
+------+
|    2 |
+------+
+------+------+------+----------+
| gid  | cid  | bid  | type     |
+------+------+------+----------+
|    2 |    3 |    3 | checking |
|    2 |    3 |    4 | savings  |
+------+------+------+----------+
在另一个查询中使用此查询,根据找到的
gid
值获取所需的行,如下所示:

SELECT
    gid
FROM
    balance
GROUP BY
    gid
HAVING
    COUNT(*) = 2;
SELECT
    b.gid,
    c.cid,
    b.bid,
    b.type
FROM
    balance b
JOIN
    client c ON b.gid = c.gid
WHERE
    b.gid IN (SELECT
                  gid
              FROM
                  balance
              GROUP BY
                  gid
              HAVING
                  COUNT(*) = 2);
这将产生以下结果:

+------+
| gid  |
+------+
|    2 |
+------+
+------+------+------+----------+
| gid  | cid  | bid  | type     |
+------+------+------+----------+
|    2 |    3 |    3 | checking |
|    2 |    3 |    4 | savings  |
+------+------+------+----------+

您可以尝试使用WHERE语句内部的EXISTS进行内部查询,如下所示:

SELECT *
    FROM client
    INNER JOIN balance b1
    ON client.gid = b1.gid
    WHERE EXISTS(
       SELECT '' FROM balance b2 
       WHERE b2.gid = b1.gid AND b2.cid != b1.cid AND b2.type != b1.type LIMIT 1); 
子查询只需在同一个表中查找gid相同但cid和类型不同的行。如果找到,该行将位于结果集中


但是我不能确定结果,因为我不完全理解您的问题。

问题在于规范的书写方式和我的解释。这种情况下,报税表不需要是既有存款又有支票的客户,而需要是支票或储蓄的客户。给出的解决方案是:

SELECT Client_Account.General_Account_General_ID,
    Client_ID,
    Balance_Account_ID,
    Account_Type 
    FROM Client_Account 
    INNER JOIN Balance_Account 
    ON Client_Account.General_Account_General_ID 
    = Balance_Account.General_Account_General_ID 
    WHERE Balance_Account.Type = "checking" 
    OR Balance_Account.Type = "savings"

在这种情况下,不澄清说明会导致我自己产生错误。

欢迎这样做。请查看
gid
cid
bid
的含义是什么?@Progman、general id、client id、balance id。数据库和表比上面的内容更复杂。然而,额外的细节应该是无关紧要的,因为要弄清楚这是否可能。我很确定这是可能的,这超出了我的知识范围。@Program,我已经做了编辑,以便我的问题更容易理解。这张桌子代表了我需要的东西,但是我不能基于给定的gid值进行查询。@Navrabains对于给定的
gid
balance
表是否有多个
checking
savings
条目,或者在特定情况下总是最多有一个
checking
和/或
savings
条目?但如果是客户有不止一个支票账户或储蓄账户。它以何种方式不可扩展,或者你的确切意思是什么?所以实际上你并没有回答你自己的问题。你能编辑这个问题吗?