gpt4 book ai didi

mysql - 如何在 DBIx::Class 的 SELECT 部分使用子查询?

转载 作者:行者123 更新时间:2023-11-29 01:35:18 25 4
gpt4 key购买 nike

请帮助在 DBIx::Class 中编写此 MySQL 查询(有一个关于如何在 DBIx::Class 中使用子查询的例子):

SELECT x, (SELECT COUNT(*) FROM t2 WHERE t2.y=x) AS c FROM t1 WHERE t1.z=123

(我知道它可以重写为 JOINGROUP BY ,但我想要的是子查询(为了让我动手做一个例子)。)

DBIx::Class文档对在 WHERE 中使用子查询进行了广泛的审查子句,但我没有找到如何在 SELECT 中使用子查询字段列表(如上例所示)。

最佳答案

您走在正确的轨道上。 as_query是你需要的。但是你还需要 columns option在第二个哈希引用中。确保使用 count_rs在子查询上,它翻转内部开关以生成一个包含 COUNT(*) 的结果集。

my $obj = ResultSet('TableOne')->search(
{
z => 123,
},
{
columns => [
'x',
{
c => ResultSet('TableTwo')->search(
{
'y' => {
-ident => 'me.x',
},
},
{
alias => 'sub_query', # this name is arbitrary
},
)->count_rs->as_query,
},
],
}
)->first;

结果查询看起来像这样:

SELECT me.x, ( 
SELECT COUNT( * )
FROM table_two sub_query
WHERE y = me.x
)
FROM table_one me
WHERE me.z = 123

如您所见,我们通过子查询选择的值在 SQL 中不称为 c,但在对象数据中称为 c

use DDP;
p $obj;

DB::Result::TableOne {
# ...
internals: {
_column_data {
x "foo",
c "bar"
},
_in_storage 1,
_result_source DBIx::Class::ResultSource::Table
}
}

您可以使用 get_column 访问它在行对象上。

say $obj->get_column('c');
# bar

关于mysql - 如何在 DBIx::Class 的 SELECT 部分使用子查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51180434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com