Добавление столбца автоматического увеличения для идентификаторов из разных таблиц с помощью UNION ALL

Я видел, что в SQL Server есть функция под названием ROW_NUMBER, в моем случае я присоединяюсь к 3 таблицам, и каждая из них имеет разные имена для столбца идентификатора (это я делаю для плагин jsTree)

У меня есть такой код:

$sql= "(SELECT
                c1.idcarrera AS id,
                c1.nombre as text,
                null as parent_id
        FROM siiupv.carrera AS c1)";
$sql. = " UNION ALL ";
$sql.= " (SELECT
                pe.idplan_estudios AS id,
                pe.clave AS text,
                pe.idcarrera as parent_id
        FROM siiupv.plan_estudios AS pe)";
$sql. = " UNION ALL ";
$sql.= " (SELECT idcarga AS id, c2.clave AS text, idplan_estudios as parent_id FROM siiupv.carga AS c2)";
$qResults = $pdo->prepare($sql);
$qResults->execute();
$count = $qResults->rowCount();
while($m = $qResults->fetch(PDO::FETCH_ASSOC)){ 
        echo '<tr><td>&nbsp;'.$m["id"].'</td><td>'.$m["text"].'</td><td>'.$m["parent_id"].'</td></tr>';
}

Он производит такой вывод:

+------+------------------+
| id   | text | parent_id |
+------+------------------+
|    1 |  A1  | NULL      |
|    2 |  A2  | NULL      |
|    3 |  A3  | NULL      |
|    1 |  B1  |   1       |
|    2 |  B2  |   2       |
|    3 |  B3  |   1       |
|    4 |  B4  |   2       |
|    5 |  B5  |   5       |
|    1 |  C1  |   4       | Note! (Child of "B4")
|    2 |  C2  |   4       | Note! (Child of "B4")
+------+------------------+

Но я хочу получить:

+------+------------------+
| id   | text | parent_id |
+------+------------------+
|    1 |  A1  | NULL      |
|    2 |  A2  | NULL      |
|    3 |  A3  | NULL      |
|    4 |  B1  |   1       |
|    5 |  B2  |   2       |
|    6 |  B3  |   1       |
|    7 |  B4  |   2       |
|    8 |  B5  |   5       |
|    9 |  C1  |   7       | Note! (Child of "B4")
|   10 |  C2  |   7       | Note! (Child of "B4")
+------+------------------+

Примечание!> Идентификаторы пройдены и поэтому должны иметь значение 7

Я хотел бы получить помощь хотя бы по идентификаторам автоинкремента

Вы можете просто использовать увеличивающуюся переменную: $row = 0; перед циклом, а затем ++$row для текущего номера строки. Однако обратите внимание, что нет никакой корреляции между этим идентификатором и любой строкой базы данных, это просто тупой счетчик.

Alex Howansky 09.01.2019 21:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
1 196
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

ВЫБЕРИТЕ CONCAT ("A-", idcarga) AS id, c2.clave AS text, CONCAT ("A-", idplan_estudios) как parent_id

Ответ принят как подходящий

Один из способов добавить номер строки к каждой записи набора результатов - использовать переменную сеанса:

SET @row_number = 0;

SELECT 
    (@row_number:=@row_number + 1) id, -- t.id
    t.text,
    t.parent_id
FROM (
    SELECT c1.idcarrera AS id, c1.nombre as text, null as parent_id FROM siiupv.carrera AS c1 ORDER BY c1.id
    UNION ALL SELECT pe.idplan_estudios AS id, pe.clave AS text, pe.idcarrera as parent_id FROM siiupv.plan_estudios AS pe ORDER BY c1.id
    UNION ALL SELECT idcarga AS id, c2.clave AS text, idplan_estudios as parent_id FROM siiupv.carga AS c2 ORDER BY c1.id
) t

он отлично работает в phpMyAdmin, но не в PHP, но мне пришлось заключить каждый SELECT между (), потому что он помечает ошибку mysql # 1221 из-за UNION & ORDER BY. ваша идея приближается, но я думаю, что это сеанс, который я не могу интерпретировать с помощью php

Manuel Ruiz 10.01.2019 01:48

Хорошо, я добавил в конце переменную с псевдонимом, теперь все в порядке. stackoverflow.com/questions/41354929/… "....) t, (SELECT @row_number: = 0) r"

Manuel Ruiz 10.01.2019 02:02

для столбца "parent_id", как я, чтобы добавить общее количество пробелов, где значение NULL, я имею в виду, я хочу изменить 4 на 7 (без тех, которые имеют NULL, перестают быть NULL), какие-либо идеи?

Manuel Ruiz 10.01.2019 02:23

Другие вопросы по теме