使用通配符选择以XXX开头的所有列?

Chr*_*ris 22 php mysql select wildcard

我的数据库中有几个名称相似的列.如何根据他们开头的单词选择那些?这是一个示例表格布局: 在此输入图像描述

我尝试使用选择特定事物的所有信息(本例中的食物种类)

$Food = "Vegetable"; 
mysql_query("SELECT `" . $Food . " %` FROM `Foods`");
Run Code Online (Sandbox Code Playgroud)

但它似乎没有用.

任何帮助,将不胜感激 :-)

编辑:显然我的例子并不清楚,但我已经知道所有专栏的第一句话.列始终相同,并且不会添加或删除任何"食物种类".PHP变量只用于确定我需要的几种类型中的哪一种.

Joe*_*lli 18

您必须动态构建SQL.作为一个起点,这将为您提供您正在寻找的列名称.

SELECT COLUMN_NAME
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE table_name = 'Foods'
        AND table_schema = 'YourDB'
        AND column_name LIKE 'Vegetable%'
Run Code Online (Sandbox Code Playgroud)

  • @Chris:您不能使用通配符作为select语句的列列表.必须动态构建SQL,以便在select中显式引用每个列名. (3认同)

Cha*_*rch 8

没有办法完全按照你的想法去做.您可以先执行另一个查询来获取所有列名,然后在PHP中处理它们并构建第二个查询,但这可能比写出您想要的名称更复杂.

或者这个查询需要是动态的吗?桌子的结构会经常变化吗?


Cat*_*nor 5

这是我用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;
Run Code Online (Sandbox Code Playgroud)

我的答案受到这个答案的启发.

注意:我的'内部DBA'(以我肩膀上的小天使的形式)告诉我,需要这样做可能是DB结构不良的标志,但我的'内部黑客'(以小的形式)魔鬼在我的另一肩膀上说"只是完成它!"