[英]Single row result of join sql query
我有一个SQL查询:
SELECT p.id, p.firstname, p.lastname, p.emailcollected, p.phone, e.accountid, e.accounttype
FROM player p
JOIN bankaccountinfo e ON p.id = e.playerid
WHERE ( ( p.createtime > 0 AND p.createtime < 2000000000 ) OR
( p.updatetime > 0 AND p.updatetime < 200000000000000 ) )
AND e.accounttype IN ( 5002,5003 ) ;
这将返回2行,结果是帐户类型有2种枚举类型:
+--------------+-----------+----------+----------------+------------+---------------+-------------+
| id | firstname | lastname | emailcollected | phone | accountnumber | accounttype |
+--------------+-----------+----------+----------------+------------+---------------+-------------+
| 9 | dineshND | NineND | 1536064455 | 5175761111 | 102323 | 5002 |
| 9 | dineshND | NineND | 1536064455 | 5175761111 | 102324 | 5003 |
+--------------+-----------+----------+----------------+------------+---------------+-------------+
但是我希望帐户号基于帐户类型在一行中显示为SavingAccountNumber和CheckingAccountNumber。
预期结果:
+--------------+-----------+----------+----------------+------------+---------------------+-----------------------+
| id | firstname | lastname | emailcollected | phone | savingaccountnumber | checkingaccountnumber |
+--------------+-----------+----------+----------------+------------+---------------------+-----------------------+
| 9 | dineshND | NineND | 1536064455 | 5175761111 | 102323 | 102324 |
+--------------+-----------+----------+----------------+------------+---------------------+-----------------------+
从样本数据和预期结果中,您可以尝试使用条件加重功能
SELECT id,
firstname,
lastname,
emailcollected,
phone,
MAX(CASE WHEN accounttype = 5003 THEN accountid END) savingaccountnumber,
MAX(CASE WHEN accounttype = 5002 THEN accountid END) checkingaccountnumber
FROM (
SELECT p.id, p.firstname, p.lastname, p.emailcollected, p.phone, e.accountid, e.accounttype
FROM player p
JOIN bankaccountinfo e ON p.id = e.playerid
WHERE ( ( p.createtime > 0 AND p.createtime < 2000000000 ) OR
( p.updatetime > 0 AND p.updatetime < 200000000000000 ) )
AND e.accounttype IN ( 5002,5003 )
) t1
GROUP BY id,firstname,lastname,emailcollected,phone
您需要两次加入bankaccountinfo
才能在一排中得到东西:一次用于支票,一次用于储蓄。 假设您(a)即使缺少帐户记录也要返回一行,并且(b)在bankaccountinfo
为playerid, accounttype
定义了一个唯一键:
SELECT
p.id,
p.firstname,
p.lastname,
p.emailcollected,
p.phone,
e1.accountid checkingaccountnumber,
e2.accountid savingaccountnumber
FROM
player p
LEFT JOIN
bankaccountinfo e1
ON
p.id = e1.playerid
AND e1.accounttype = 5002
LEFT JOIN
bankaccountinfo e2
ON
p.id = e2.playerid
AND e2.accounttype = 5003
WHERE
(p.createtime > 0 AND p.createtime < 2000000000)
OR (p.updatetime > 0 AND p.updatetime < 200000000000000)
无论哪种方式,都要仔细研究JOIN和IN的作用,以了解为什么会得到两个结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.