【问题标题】:Adding auto increment column for IDs from differents tables using UNION ALL使用 UNION ALL 为来自不同表的 ID 添加自动增量列
【发布时间】:2019-01-09 20:35:27
【问题描述】:

我看到在 SQL Server 中有一个名为 ROW_NUMBER 的函数,在我的例子中,我加入了 3 个表,每个表的 ID 列都有不同的名称(我这样做是为了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>&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")
+------+------------------+

注意! > ID 被遍历,因此必须具有值7

我希望至少获得自动增量 ID 的帮助

【问题讨论】:

  • 你可以只使用一个递增变量:$row = 0; 在循环之前然后++$row 用于当前行号。但是请注意,此 id 与任何数据库行之间没有关联,它只是一个愚蠢的计数器。

标签: php mysql jstree


【解决方案1】:

向结果集的每条记录添加行号的一种方法是使用会话变量:

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 解释的会话
  • 好的,我在最后添加了一个带别名的变量,现在一切都很好。 stackoverflow.com/questions/41354929/… "....) t, (SELECT @row_number := 0) r "
  • 对于列“parent_id”,就像我添加值为 NULL 的总空间一样,我的意思是,我想将 4 更改为 7(没有那些为 NULL 的不再是 NULL),任何想法?
【解决方案2】:

不确定我是否真的遇到了问题,但您可以通过添加前缀或其他方式生成新的唯一 ID。

SELECT CONCAT("A-", idcarga) AS id, c2.clave AS text, CONCAT("A-", idplan_estudios) as parent_id

【讨论】:

    猜你喜欢
    • 2020-09-05
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    相关资源
    最近更新 更多