繁体   English   中英

连接SQL查询的单行结果

[英]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     |
+--------------+-----------+----------+----------------+------------+---------------------+-----------------------+
  • 帐户类型为5003时的Savingaccountnumber列
  • 当accountype为5002时,检查accountnumber列
  • My Mysql版本: mysql Ver 14.12 Distrib 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)在bankaccountinfoplayerid, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM