我想问一下,是否可以让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']];
答案 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; ...