MySql 选择具有多个特定列的所有表

Posted

技术标签:

【中文标题】MySql 选择具有多个特定列的所有表【英文标题】:MySql select all tables with multiple specific columns 【发布时间】:2014-05-20 06:04:32 【问题描述】:

我想获取所有包含 3 个特定列的表名。

我想要的是从信息架构中获取所有表名,其中包含columnA AND columnB AND @987654324 @。

目前我正在使用类似的查询

SELECT DISTINCT TABLE_NAME 
  FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME='columnA'
        AND TABLE_SCHEMA='mysampledatabase';

如何扩展上述查询并选择包含列名columnAcolumnB 的表?


我遇到了this answer 和其他类似的答案。他们的回答如下:

SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME IN ('columnA','ColumnB') AND TABLE_SCHEMA='YourDatabase';

但是,他们选择具有 3 列之一的任何表。我相信这是因为WHERE COLUMN_NAME IN ('columnA','ColumnB','ColumnC'),我相信它等同于COLUMN_NAME = 'columnA' OR COLUMN_NAME = 'columnB' OR COLUMN_NAME = 'columnC'


我尝试将 WHERE 子句替换为 WHERE COLUMN_NAME='columnA' AND COLUMN_NAME='columnB' AND COLUMN_NAME='columnC' 显然不会返回任何结果,因为 COLUMN_NAME 一次只能是 1 个值!

【问题讨论】:

【参考方案1】:

这是一个更快的版本:

SELECT TABLE_NAME 
      FROM INFORMATION_SCHEMA.COLUMNS
      WHERE COLUMN_NAME IN ('columnA','columnB','columnC')
group by TABLE_NAME
having count(distinct COLUMN_NAME) = 3 

在上面的查询中,计数将没有。 IN 短语中指定的列数。

或尝试关注(但它会为这么多列造成灾难。所以避免它)

SELECT DISTINCT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME IN 
( SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'columnA' )
and TABLE_NAME in 
( SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'columnB')
and TABLE_NAME in 
( SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 'columnC')

【讨论】:

感谢您的回复。您的解决方案 2 会非常慢,因为它遍历 INFORMATION_SCHEMA.COLUMNS 表,该表通常很大,3 次。如果我想比较 6 列怎么办?为您的贡献 +1。【参考方案2】:

以下查询可能对您有所帮助:

SELECT`TABLE_SCHEMA`, `table_name`,c1.`column_name`,c2.`column_name`,c3.`column_name` FROM `COLUMNS` C1
INNER JOIN `COLUMNS` C2 USING(`TABLE_SCHEMA`, `TABLE_NAME`)
INNER JOIN `COLUMNS` C3 USING(`TABLE_SCHEMA`, `TABLE_NAME`)
WHERE c1.`column_name` = 'col1'
AND c2.`column_name` = 'col2'
AND c3.`column_name` = 'col3';

但您需要为要查找的每一列添加|删除额外的JOIN

现在我觉得它有点沉重和难以理解,这是另一种选择:

SELECT table_schema, table_name, count(*) AS `TablesCount` FROM `COLUMNS`
WHERE `column_name` IN ('col1','col1','col1')
GROUP BY table_schema, table_name
HAVING `TablesCount` = 3

TablesCount 应该与您要查找的列数相等。如果是这样,那么您的表格具有所有必需的列

【讨论】:

谢谢。我尝试了第一个查询,它有效,但确实很重。但是,我应该在第二个查询中将列名 columnAcolumnGcolumnX 等放在哪里? @Nis 哦,对不起,我正在测试并忘记从查询中删除我的列。更新*(第二行) 谢谢。对于其他对性能结果感兴趣的人,解决方案 2 的速度(执行时间的一半)至少是解决方案 1 的两倍。例如如果灵魂 1 需要 36 秒(是的,我有巨大的数据库),解决方案 2 最多只需要 18 秒。

以上是关于MySql 选择具有多个特定列的所有表的主要内容,如果未能解决你的问题,请参考以下文章

MySQL Select ID 出现在具有多个特定值的列的不同行上

从列具有特定值的所有表中选择表名

如何使用 Nhibernate 从连接两个具有所有 id 的表中选择只有一个不同列的多个列是 UNIQUEIDENTIFIER

MySQL选择其他表中没有匹配列的行

选择具有相同列的所有行以分隔mysql中的列

如何在sql中选择特定的表? [复制]