【问题标题】:How to query multiple tables for a record where tables have identical column names如何查询多个表以获取表具有相同列名的记录
【发布时间】:2023-04-07 04:27:02
【问题描述】:

我有一个包含两个表、交换机和路由器的数据库。两个表中的列具有相同的名称(dev_name、dev_ip 等)。

我需要知道如何查询这两个表并找到具有特定主机名的单个记录。因此,如果我的 PHP 表单是通过设备名称查询数据库,我想查询整个数据库(所有表)并找到具有被查询设备的表/行。

我试过这样的查询:

SELECT * FROM switches,routers 
WHERE switches.dev_name = 'coreswitch01' OR routers.dev_name = 'core01switch';

但它给了我一个串联的输出,其中包括路由器表中的每个路由器和 coreswitch01 重复。

SELECT * FROM switches,routers 
WHERE switches.dev_name = 'coreswitch01' OR routers.dev_name = 'core01switch';

我希望构建的是一个查询,它读取两个表并找到 coreswitch01 的记录,然后只向我显示它找到的任何表中的一条记录。

【问题讨论】:

  • 只是为了帮助您理解为什么会看到您所看到的结果,两个表名之间的,JOIN 查询的简写语法;这就是行连接的来源;此外,如果没有 JOIN 条件,您的结果是笛卡尔连接,这就是重复的来源; HTH; Mureinik 的答案是您想要实际实现的目标的出色而简洁的答案

标签: mysql sql select mariadb


【解决方案1】:

您可以使用union all 集合运算符:

SELECT *
FROM   (SELECT * FROM switches
        UNION ALL
        SELECT * FROM routers) t
WHERE  dev_name = 'coreswitch01'

【讨论】:

  • 这个公式将对所有数据进行 3 次完整传递——一次查找每个表中的所有行,第二次将它们写入临时表,第三次搜索联合国- 所需行的索引临时表。非常低效。
【解决方案2】:

每当我看到两个表具有相同(或几乎相同)的列时,我都会问“为什么这两个表没有合并到一个表中?”您可能需要一个额外的列来说明它是哪种东西(路由器与交换机),但这是一个很小的开销。

但是,鉴于您有 2 张桌子...

对于您的特定查询,这是最佳选择:

( SELECT * FROM switches  WHERE dev_name = 'coreswitch01' )
UNION ALL
( SELECT * FROM routers   WHERE dev_name = 'coreswitch01' )

这假设您在每个表中都有一个关于 dev_name 的索引。

【讨论】:

    【解决方案3】:

    如果你想确定数据表的来源,你可以创建一个新的字段,比如“origin”:

    SELECT *
    FROM   (SELECT 'switches' as origin, * FROM switches
            UNION ALL
            SELECT 'routers'  as origin, * FROM routers) t
    WHERE  dev_name = 'coreswitch01'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多