使用通配符选择所有以 XXX 开头的列?
Posted
技术标签:
【中文标题】使用通配符选择所有以 XXX 开头的列?【英文标题】:Selecting all columns that start with XXX using a wildcard? 【发布时间】:2011-06-15 10:10:06 【问题描述】:我的数据库中有几列名称相似。 我如何根据它们开头的单词来选择它们? 这是一个示例表格布局:
我尝试使用
选择特定事物(本例中为食物种类)的所有信息$Food = "Vegetable";
mysql_query("SELECT `" . $Food . " %` FROM `Foods`");
但它似乎没有用。
任何帮助将不胜感激:-)
编辑:显然这在我的示例中并不清楚,但我已经知道所有列的第一个单词。列始终相同,并且从未添加或删除任何“食物种类”。 PHP 变量仅用于确定我需要几种设置类型中的哪一种。
【问题讨论】:
除了我想不出任何理智的方法来做到这一点之外,这不是一个好主意,原因与 SELECT * 不是一个好主意一样;如果您添加/删除与蔬菜相关的列,您的查询将返回意外结果。 我想这里的每个人都明白这个问题。我们所说的是,您将无法在一次调用中创建这样的查询。如果您知道每个列的名称,然后循环进入它们以查找以您的前缀开头的列,然后动态生成 SQL Select 语句。 好吧,在根据列名选择数据时不允许使用通配符这一事实让我有点困惑。 【参考方案1】:您必须动态构建 SQL。作为起点,这将为您提供您正在寻找的列名。
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'Foods'
AND table_schema = 'YourDB'
AND column_name LIKE 'Vegetable%'
【讨论】:
对不起,也许我的例子不够清楚,但我已经知道所有列名,它们将保持不变。我只是在寻找正确的通配符和使用它的方法。 @Chris:您不能在 select 语句的列列表中使用通配符。 SQL 必须动态构建,以便在选择中显式引用每个列名。 好的,然后我将单独定义我的列,在我定义的每个名称中使用 php 变量 :-) 谢谢【参考方案2】:没有办法完全按照您的意愿去做。您可以先执行另一个查询以获取所有列名,然后在 PHP 中处理它们并构建第二个查询,但这可能比写出您想要的名称更复杂。
或者这个查询需要动态的原因是什么?表的结构会经常变化吗?
【讨论】:
不,它永远不会改变,所以我认为这不是很复杂,我只需要正确的通配符来匹配某种类型的所有列(= 以特定单词开头,定义为一个 PHP 变量)。 @Chris:这就是我要说的,没有这样的通配符。 MySQL 不支持。您要么必须为所有列添加*
,要么单独定义它们。
如何单独定义它们?一个例子的链接就足够了:]
如果列始终保持不变,您可以在某处定义一个变量,例如 $VegetableColumns = 'VegetableName, VegetableColor';
,然后在查询中使用它。
单独定义列只需SELECT VegetableName, VegetableColor FROM table
。如果你有像我上一条评论这样的变量,你可以做类似$query = "SELECT $VegetableColumns FROM table";
【参考方案3】:
这是我纯粹使用 MySQL 的一种方式:
SET SESSION group_concat_max_len = 2048;
SELECT GROUP_CONCAT(CONCAT(" ",CAST(column_name as CHAR(50)))) FROM information_schema.columns WHERE table_name='real_big_table' AND column_name LIKE 'prefix%' INTO @sub;
SET @x = CONCAT("SELECT ",@sub," FROM my_db.real_big_table WHERE my_db.real_big_table.country_id='US'");
PREPARE stmt FROM @x;
EXECUTE stmt;
我的回答灵感来自this answer。
注意:我的“内部 DBA”(以我肩膀上的小天使的形式)告诉我需要这样做可能是数据库结构不良的标志,但我的“内部黑客”(以我另一肩上的小恶魔的形式)说“完成它!”
【讨论】:
【参考方案4】:将您的数据库转换为一个包含三列的数据库:
Product_type (vegetable, fruit, etc)
Name (apple, carrot, etc)
color (orange, yellow, etc)
现在你可以使用你的通配符来获取特定的类型,因为它现在是在列中,而不是在标题中。
【讨论】:
【参考方案5】:如何分两步创建查询?
1- 从 db 架构(或其他地方)获取列的名称
2- 使用与您的过滤条件匹配的列名称生成一个 sql 查询。
【讨论】:
我已经知道列的名称,我正在寻求帮助来创建将匹配相似列的查询,其中我已经知道第一个单词。以上是关于使用通配符选择所有以 XXX 开头的列?的主要内容,如果未能解决你的问题,请参考以下文章