【问题标题】:Do a Count for every row inside an inner join对内部联接中的每一行进行计数
【发布时间】:2021-11-06 20:22:25
【问题描述】:

我有几个表格,其中包含网页中请求的数据。问题是,我做了一些内部连接来合并请求表中外键的数据,但我想添加一个列来计算发送请求的办公室总共拥有的相应设备。

这是我的代码,以便更好地理解我的要求。

我的查询是这样的:

SELECT realiza_soli.*, oficina.id_lugar, oficina.desc_lugar,
tipo_equipamiento.nom_tipo FROM realiza_soli
INNER JOIN usuario
ON realiza_soli.fk_user = usuario.id_user
INNER JOIN tipo_equipamiento
ON realiza_soli.fk_tipo = tipo_equipamiento.id_tipo
INNER JOIN oficina
ON usuario.fk_ofic = oficina.id_lugar
AND realiza_soli.estado_soli = 'Pendiente Info'
ORDER BY realiza_soli.id_soli ASC;

生成的表格是这样的:

+---------+-------------+----------------------+----------------+----------------+----------------+---------+---------+----------+------------+----------+
| id_soli | titulo_soli | desc_soli            | estado_soli    | fecha_ini_soli | fecha_fin_soli | fk_tipo | fk_user | id_lugar | desc_lugar | nom_tipo |
+---------+-------------+----------------------+----------------+----------------+----------------+---------+---------+----------+------------+----------+
|       1 | Solicitud 1 | Descripción          | Pendiente Info | 2020-01-01     | NULL           |       1 |       4 |       10 | Oficina 10 | Monitor  |
|      13 | 25 Monitor  | Dame mmmmmmmaaaaaaas | Pendiente Info | 2021-11-05     | NULL           |       1 |       5 |        5 | Oficina 5  | Monitor  |
+---------+-------------+----------------------+----------------+----------------+----------------+---------+---------+----------+------------+----------+

问题是,我想根据“oficina”表为每一行添加一个计数,从“equipamiento”表中计算它有多少设备。

这是我的“设备”表:

+----------+------------+----------+-----------------+-------------+------------+-------------+--------------+-----------+---------+----------+---------+---------+
| id_equip | fecha_adq  | garantia | desc_equip      | marca_equip | tipo       | lugar_equip | estado_equip | fk_estado | fk_tipo | fk_marca | fk_ofic | fk_prov |
+----------+------------+----------+-----------------+-------------+------------+-------------+--------------+-----------+---------+----------+---------+---------+
|        1 | 2020-01-01 |       24 | Teclado         | Kolke       | Componente | Oficina 5   | Instalado    |         4 |      21 |        3 |       5 |       1 |
|        2 | 2020-02-02 |       12 | Tarjeta Gráfica | NVIDIA      | Componente | Oficina 3   | Instalado    |         4 |       6 |        7 |       3 |       2 |
|        3 | 2020-03-03 |        9 | Memoria RAM     | ADATA       | Componente | NULL        | Stock        |         2 |       7 |       26 |    NULL |    NULL |
|        4 | 2020-04-04 |       10 | Tarjeta de Red  | Realtek     | Componente | Oficina 2   | Instalado    |         4 |       5 |       20 |       2 |       3 |
|        5 | 2020-01-01 |       12 | Monitor         | Samsung     | Componente | Oficina 5   | Instalado    |         4 |       1 |       22 |       5 |       3 |
+----------+------------+----------+-----------------+-------------+------------+-------------+--------------+-----------+---------+----------+---------+---------+

如您所见,'equipamiento' 表有 'fk_ofic' 列,它引用了 'oficina' 表:

+----------+------------+-------------+-----------------+--------------+--------------+-----------+--------+----------+
| id_lugar | desc_lugar | grupo_lugar | dir_lugar       | depart_lugar | ciudad_lugar | tel_lugar | fk_dep | fk_grupo |
+----------+------------+-------------+-----------------+--------------+--------------+-----------+--------+----------+
|        1 | Oficina 1  | Oficina     | Calle Random 1  | Montevideo   | Montevideo   |  94132471 |      1 |        5 |
|        2 | Oficina 2  | Oficina     | Calle Random 2  | Montevideo   | Montevideo   |  91356985 |      1 |        5 |
|        3 | Oficina 3  | Oficina     | Calle Random 3  | Montevideo   | Montevideo   |  92358985 |      1 |        5 |
|        4 | Oficina 4  | Oficina     | Calle Random 4  | Montevideo   | Montevideo   |  95355685 |      1 |        5 |
|        5 | Oficina 5  | Oficina     | Calle Random 5  | Montevideo   | Montevideo   |  97356990 |      1 |        5 |
|        6 | Oficina 6  | Oficina     | Calle Random 6  | Montevideo   | Montevideo   |  99344985 |      1 |        5 |
|        7 | Oficina 7  | Oficina     | Calle Random 7  | Montevideo   | Montevideo   |  91234567 |      1 |        5 |
|        8 | Oficina 8  | Director    | Calle Random 8  | Montevideo   | Montevideo   |  91234567 |      1 |        1 |
|        9 | Oficina 9  | Informática | Calle Random 9  | Montevideo   | Montevideo   |  91234567 |      1 |        2 |
|       10 | Oficina 10 | SubB        | Calle Random 10 | Montevideo   | Montevideo   |  91234567 |      1 |        4 |
|       11 | Oficina 11 | Compras     | Calle Random 11 | Montevideo   | Montevideo   |  91234567 |      1 |        6 |
|       12 | Oficina 12 | Compras     | Calle Random 12 | Montevideo   | Montevideo   |  91234567 |      1 |        6 |
+----------+------------+-------------+-----------------+--------------+--------------+-----------+--------+----------+

如果我在这两个表之间进行内部连接,您可以看到每个办公室安装了哪些设备:

+----------+-----------------+----------+------------+
| id_equip | desc_equip      | id_lugar | desc_lugar |
+----------+-----------------+----------+------------+
|        1 | Teclado         |        5 | Oficina 5  |
|        2 | Tarjeta Gráfica |        3 | Oficina 3  |
|        4 | Tarjeta de Red  |        2 | Oficina 2  |
|        5 | Monitor         |        5 | Oficina 5  |
+----------+-----------------+----------+------------+

所以,两个组件安装在一个办公室,办公室 5,一个在办公室 2,一个在办公室 3。根据这些信息,我想为每个办公室添加一个 total_equipment 列。这是想要的结果:

+---------+-------------+----------------------+----------------+----------------+----------------+---------+---------+----------+------------+----------+--------------+
| id_soli | titulo_soli | desc_soli            | estado_soli    | fecha_ini_soli | fecha_fin_soli | fk_tipo | fk_user | id_lugar | desc_lugar | nom_tipo | total_equip |
+---------+-------------+----------------------+----------------+----------------+----------------+---------+---------+----------+------------+----------+--------------+
|       1 | Solicitud 1 | Descripción          | Pendiente Info | 2020-01-01     | NULL           |       1 |       4 |       10 | Oficina 10 | Monitor  |           0 |
|      13 | 25 Monitor  | Dame mmmmmmmaaaaaaas | Pendiente Info | 2021-11-05     | NULL           |       1 |       5 |        5 | Oficina 5  | Monitor  |           2 |
+---------+-------------+----------------------+----------------+----------------+----------------+---------+---------+----------+------------+----------+--------------+

这是因为第一个请求属于安装了 0 台设备的办公室 10,而第二个请求属于安装了 2 台设备的办公室 5。

对不起,如果我的解释很糟糕,但我无法用其他方式解释它。希望任何人都可以提供帮助。如果您对我的代码有任何疑问,我可以解释。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    如果我理解您的描述正确,这应该可以:

    SELECT 
       realiza_soli.*, 
       oficina.id_lugar, 
       oficina.desc_lugar,
       tipo_equipamiento.nom_tipo,
       (SELECT COUNT(*) FROM equipamiento WHERE equipamiento.fk_ofic = oficina.id_lugar) as total_equip
    FROM realiza_soli
    INNER JOIN usuario ON realiza_soli.fk_user = usuario.id_user
    INNER JOIN tipo_equipamiento ON realiza_soli.fk_tipo = tipo_equipamiento.id_tipo
    INNER JOIN oficina ON usuario.fk_ofic = oficina.id_lugar
                      AND realiza_soli.estado_soli = 'Pendiente Info'
    ORDER BY realiza_soli.id_soli ASC;
    

    【讨论】:

      猜你喜欢
      • 2012-10-27
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-20
      相关资源
      最近更新 更多