使用 UNION ALL 为来自不同表的 ID 添加自动增量列
Adding auto increment column for IDs from differents tables using UNION ALL
我看到在SQL服务器中有一个叫做 , in my case I am joining 3 tables and each one has different names for the ID column (this I am doing for the jsTree plugin)
的函数
我有这个代码:
$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> '.$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")
+------+------------------+
注意! > ID是遍历的,所以必须有值7
我希望至少获得有关自动增量 ID 的帮助
不确定我是否真的遇到了问题,但您可以通过添加前缀或其他方式生成新的唯一 ID。
SELECT CONCAT("A-", idcarga) AS id, c2.clave AS text, CONCAT("A-", idplan_estudios) as 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
我看到在SQL服务器中有一个叫做
我有这个代码:
$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> '.$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")
+------+------------------+
注意! > ID是遍历的,所以必须有值7
我希望至少获得有关自动增量 ID 的帮助
不确定我是否真的遇到了问题,但您可以通过添加前缀或其他方式生成新的唯一 ID。
SELECT CONCAT("A-", idcarga) AS id, c2.clave AS text, CONCAT("A-", idplan_estudios) as 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