如何从列名称来自子查询的列中获取值?

时间:2011-08-23 20:17:25

标签: php mysql

我想问一下,是否可以让MySQL将子查询的结果解释为可以从中选择的表列而不仅仅是字符串?

我所拥有的是一些表,其中动态创建了一些列,以及一个存储这些自定义列的表。

在这个特定的实现中,我使用它来存储我们正在开发的内容管理系统的自定义文章的自定义字段。

这是架构的草图。

custom_column
-----------------------------------------------------------------
id       field_name      field_type   field_display    table_name
-----------------------------------------------------------------
1        news_author      string       Author              news
2        news_body        text         Body                news
3        news_heading     title        Heading             news
4        name             title        Name                testimonials
5        message          text         Message             testimonials

考虑到所有文章(新闻,推荐书等)都有field_type = title的相应自定义字段...

我想指定一个特定的表/文章,并通过执行以下操作获得所有记录的文章标题:

SELECT (SELECT field_name FROM custom_columns WHERE field_type = "title" AND table_name = "testimonials") AS article_title FROM testimonials

得到一个结果:

id       article_title
-----------------------
1        John Doe
2        Mary Jane
3        Justin Case

而不是这个,这是MySQL通过上述查询给我的东西:

id       article_title
-----------------------
1        name
2        name
3        name

我可以看到MySQL正在将name - 子查询的结果 - 解释为字符串,而不是要从中选择的列名。

当然,我可以这样做:

SELECT *, (SELECT field_name FROM custom_columns WHERE field_type = "title" AND table_name = "testimonials") AS article_title FROM testimonials

操纵结果以在程序中获得我想要的内容,例如:

$article_title = $row->{$row->article_title};
//I use PHP, and most times use mysql_fetch_object to fetch rows from a MySQL resource.

但是我希望避免查询我不需要的所有无用的列,并希望节省资源。毕竟,我只需要一个可变数量的一列,理论上可以很多。

我到处寻找一个我可能缺少的MySQL功能,但是从来没有找到过。我希望有人可以指出我正确的方向,或者更好的是,如果有的话,提供更好的解决方案。

谢谢!

编辑:对于那些可能不熟悉上面的PHP语法的人来说,这是一个等效的场景,但使用非常常见的数组语法代替PHP的对象语法:

$row[$row['article_title']];

4 个答案:

答案 0 :(得分:1)

如果您执行以下操作:

select table1.field, (select something from table2), ...
from table1

然后子查询的结果将被视为一个字段。要将子查询的结果视为表格,请执行

select table1.field, subquerytable.field ...
from table1, (select field from table2) as subquerytable
...

答案 1 :(得分:0)

一般的经验法则是,只要您需要在SQL中动态查找列(PHP不同),您就应该重新考虑您的架构。如果你问一个如何做到这一点的问题,我相信你会发现很多SO愿意帮忙。

我发现的唯一动态MySQL是in this question,其他一切都是变种。除非您可以提前知道可能的列名,否则$article_title = $row->{$row->article_title};实际上是最佳解决方案。

答案 2 :(得分:0)

试试这个:

SELECT id, (SELECT field_name FROM custom_columns WHERE field_type = "title" AND table_name = "testimonials") AS article_title FROM testimonials ORDER BY id ASC

我可以在没有id的情况下工作,但你必须尝试。

HTH

答案 3 :(得分:0)

您可以使用EXECUTE DECLARE TabName VARCHAR(32); - 获取表名 从custom_columns中选择table_name到tabName ..... - 创建查询字符串 设置@qry = CONCAT(“SELECT * FROM”,tabName,“....”); - 执行查询 准备stmt FROM @s; 执行stmt; ...