Mysql 联接sql查询的单行结果
我有一个sql查询:Mysql 联接sql查询的单行结果,mysql,sql,join,select,Mysql,Sql,Join,Select,我有一个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.updatetim
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 ) ;
但我希望accountnumber以单行形式显示为savingaccountnumber和checkingaccountnumber(基于accounttype)
预期结果:
accounttype为5003时的savingaccountnumber列
AccountType为5002时检查AccountNumber列
我的Mysql版本:Mysql版本14.12发行版5.0.51a,适用于使用readline 5.2的debian linux gnu i486
根据样本数据和预期结果,您可以尝试使用条件加重函数
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:
不管是哪种方式,复习一下JOIN和IN做了什么,以了解为什么会得到两个结果 尝试使用“分组方式”玩家CardidSee:尝试使用“分组方式”玩家Cardid没有很坏的建议@Siva not Group By“使用Group By DISTINCT取消复制是不符合逻辑的,使用Group By DISTINCT意味着取消复制。。此外,当选择不在GROUPBY子句中的列时,由于MySQL扩展了GROUPBY功能,因此它倾向于生成
+--------------+-----------+----------+----------------+------------+---------------------+-----------------------+
| 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
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)