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
条目?但如果是客户有不止一个支票账户或储蓄账户。它以何种方式不可扩展,或者你的确切意思是什么?所以实际上你并没有回答你自己的问题。你能编辑这个问题吗?