Однострочный результат соединения sql-запроса - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть 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 |
+--------------+-----------+----------+----------------+------------+---------------+-------------+

Но я хочу, чтобы номер учетной записи отображалсяв одну строку в виде сохраняемого номера счета и проверяемого номера счета в зависимости от типа счета.

Ожидаемый результат:

+--------------+-----------+----------+----------------+------------+---------------------+-----------------------+
| id           | firstname | lastname | emailcollected | phone      | savingaccountnumber | checkingaccountnumber |
+--------------+-----------+----------+----------------+------------+---------------------+-----------------------+
|            9 | dineshND  | NineND   |     1536064455 | 5175761111 | 102323              |            102324     |
+--------------+-----------+----------+----------------+------------+---------------------+-----------------------+
  • столбец сохранения числа_подписки при типе счета 5003
  • Столбец проверкиaccountnumber, когда accountype равен 5002
  • Моя версия Mysql: mysql Ver 14.12 Distrib 5.0.51a, для debian-linux-gnu (i486) с использованием readline 5.2

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Вам нужно присоединиться к bankaccountinfo дважды, чтобы получить вещи в один ряд: один раз для проверки и один раз для экономии.Предполагая, что вы (а) хотите вернуть строку, даже если записи учетной записи отсутствуют, и (б) наличие уникального ключа, определенного в 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, чтобы понять, почему вы получили два результата.

0 голосов
/ 13 декабря 2018

Исходя из данных выборки и ожидаемого результата, вы можете попытаться использовать функцию с ухудшением условий

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...