Я считаю, что должен быть простой способ сделать это, но я застрял здесь! Я прочитал более 20 страниц здесь и в других местах, но не смог найти то, что мне нужно.
У меня есть одна таблица с несколькими тысячами строк и десятками столбцов, но для упрощения давайте представим следующую таблицу qu
- это мои данные:
+----+-----+-----+------+
| id | PID | AID | Data |
+----+-----+-----+------+
| 1 | A | 1 | 56 |
| 2 | A | 2 | 234 |
| 3 | B | 1 | 23 |
| 4 | B | 2 | 78 |
| 5 | B | 3 | 65 |
| 6 | C | 2 | 89 |
| 7 | C | 3 | 74 |
+----+-----+-----+------+
Я хочу запрос, который генерирует следующие результаты:
+-----+-----+------+
| PID | AID | Data |
+-----+-----+------+
| A | 1 | 56 |
| A | 2 | 234 |
| A | 3 | NULL |
| B | 1 | 23 |
| B | 2 | 78 |
| B | 3 | 65 |
| C | 1 | NULL |
| C | 2 | 89 |
| C | 3 | 74 |
+-----+-----+------+
По сути, я хочу, чтобы запрос заполнил все недостающие AID
для PID
s и добавьте NULL
или NA
для их значений Data
. Я могу добиться этого, выполняя циклы вне MySQL, но это очень медленно, так как мне нужно запускать отдельные запросы для каждой комбинации PID
и AID
, чтобы получить значение Data
.
Вот один из моих последних попыток безуспешно!
SELECT
*
FROM
(
SELECT
`id`,
`PID`
FROM
`qu`
GROUP BY
`PID`
) `a`
LEFT OUTER JOIN(
SELECT
`id`,
`AID`
FROM
`qu`
GROUP BY
`AID`
) `b`
ON
`a`.`id` = `b`.`id`
LEFT OUTER JOIN `qu` `c` ON
`a`.`id` = `c`.`id` AND `b`.`id` = `c`.`id`