Mysql 基于行值联接新列
我有一张名为flux的桌子,上面有: 以及一个名为flux_rules的表,其中包含: 还有一个名为modele_scrape的表,其中包含: 我相信这是一个非常常见的设置,但我还没有找到关于我试图实现的内容的信息,这是一个SELECT查询,它将列出modele_scrape中的所有行,并为flux中的每一行指定一列,其中值由flux_规则第1列定义(如果存在),否则为0:Mysql 基于行值联接新列,mysql,sql,Mysql,Sql,我有一张名为flux的桌子,上面有: 以及一个名为flux_rules的表,其中包含: 还有一个名为modele_scrape的表,其中包含: 我相信这是一个非常常见的设置,但我还没有找到关于我试图实现的内容的信息,这是一个SELECT查询,它将列出modele_scrape中的所有行,并为flux中的每一行指定一列,其中值由flux_规则第1列定义(如果存在),否则为0: modele_scrape.id modele_scrape.modele test1 test2 1
modele_scrape.id modele_scrape.modele test1 test2
1 test 1 0
现在我有一个工作查询,但它只能从flux连接一行:
SELECT id AS id,
(SELECT IF (EXISTS (SELECT id_flux, id_modele_scrape FROM flux_rules WHERE id_flux = 20 AND id_modele_scrape = modele_scrape.id), 1, 0) ) AS disallowed
FROM modele_scrape
该解决方案的工作原理应该是动态地连接X数量的列,其中X是通量中的行数量,可以添加/删除此表中的行。一般来说,这听起来像是希望透视您的信息,这可以通过使用条件聚合来实现。基本上,这意味着在聚合函数中使用case表达式,通常这是max函数
select
m.id
, m.modele
, max(case when r.r.flux_id = 1 then flux.name end) as `name1`
, max(case when r.r.flux_id = 2 then flux.name end) as `name2`
, max(case when r.r.flux_id = 3 then flux.name end) as `name3`
from modele_scrape as m
left join flux_rules as r on m.id = r.id_modele_scrape
left join flux as f on r.flux_id = f.id
group by
m.id
, m.modele
MySQL中的动态透视
要动态生成这样的轴,将使用以下查询:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
' max(case when r.id_flux = ''',
id,
''' then 1 else 0 end) ',
name
)
) INTO @sql
FROM
flux;
set @sql = CONCAT('SELECT m.id, m.modele,', @sql,
' from modele_scrape as m',
' left join flux_rules as r on m.id = r.id_modele_scrape',
' left join flux as f on r.id_flux = f.id',
' group by m.id, m.modele')
;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
将此视为
注意:由于样本数据有限,我选择通过直接查询flux表来生成动态列,在实际表中,这可能会生成比您想要/需要的更多的列,因此请调整group_concat查询,可能会使用到其他表的联接和/或where子句,为了满足您的数据和需求一般来说,这听起来像是希望集中您的信息,这可以通过使用条件聚合来实现,基本上这意味着在聚合函数中使用case表达式,通常这是max函数
select
m.id
, m.modele
, max(case when r.r.flux_id = 1 then flux.name end) as `name1`
, max(case when r.r.flux_id = 2 then flux.name end) as `name2`
, max(case when r.r.flux_id = 3 then flux.name end) as `name3`
from modele_scrape as m
left join flux_rules as r on m.id = r.id_modele_scrape
left join flux as f on r.flux_id = f.id
group by
m.id
, m.modele
MySQL中的动态透视
要动态生成这样的轴,将使用以下查询:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
' max(case when r.id_flux = ''',
id,
''' then 1 else 0 end) ',
name
)
) INTO @sql
FROM
flux;
set @sql = CONCAT('SELECT m.id, m.modele,', @sql,
' from modele_scrape as m',
' left join flux_rules as r on m.id = r.id_modele_scrape',
' left join flux as f on r.id_flux = f.id',
' group by m.id, m.modele')
;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
将此视为
注意:由于样本数据有限,我选择通过直接查询flux表来生成动态列,在实际表中,这可能会生成比您想要/需要的更多的列,因此请调整group_concat查询,可能会使用到其他表的联接和/或where子句,为满足您的数据和要求需要样本数据和预期结果。也许你可以设置一个sqlfiddle?我认为你需要条件聚合和“分组”或者使用你的描述中的枢轴,但是没有数据,很难知道SuRei还不能使一个SqLFIDLE构建模式不起作用,但是我现在正在添加数据。对于SqLFIDLE的好的选择是,但是也许你可以在我做更多的事情之前考虑我的答案。需要数据样本数据和预期结果。也许你可以设置一个sqlfiddle?我认为你需要条件聚合和“分组”或者使用你的描述中的枢轴,但是没有数据,很难知道SuRei还不能使一个SqLFIDLE构建模式不起作用,但是我现在正在添加数据。对于SqLFIDLE的好的选择是,但是也许你可以在我做更多的事情之前考虑我的答案。datanote:在上面显示的case表达式中,我使用了flux.name作为您在结果中看到的值,这只是一个任意选择,它可以是flux表中的其他列,但不确定要使用哪一列。感谢您对这一点的理解。虽然这似乎是可行的,但它将连接固定数量的第3列,但我正在寻找一种方法来连接通量中每一行的一列,并且可以添加/删除行。我更新了我的问题,使之更清楚一些,很抱歉混淆了。我已经在我的答案中添加了动态sql。动态透视的唯一方法是使用动态sql,这是用于生成其他sql的sql。这里有很多使用动态sql进行数据透视的例子,现在还有另一个。这比我想象的要复杂得多,非常感谢您分享您的知识!注意:在上面显示的case表达式中,我使用了flux.name作为您在结果中看到的值,这只是一个任意选择,它可以是flux表中的其他列,但不确定要使用哪一列。感谢您对这一点的理解。虽然这似乎是可行的,但它将连接固定数量的第3列,但我正在寻找一种方法来连接通量中每一行的一列,并且可以添加/删除行。我更新了我的问题,使之更清楚一些,很抱歉混淆了。我已经在我的答案中添加了动态sql。动态透视的唯一方法是使用动态sql,这是用于生成其他sql的sql。这里有很多使用动态sql进行数据透视的例子,现在还有另一个。这比我想象的要复杂得多,非常感谢您分享您的知识!
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
' max(case when r.id_flux = ''',
id,
''' then 1 else 0 end) ',
name
)
) INTO @sql
FROM
flux;
set @sql = CONCAT('SELECT m.id, m.modele,', @sql,
' from modele_scrape as m',
' left join flux_rules as r on m.id = r.id_modele_scrape',
' left join flux as f on r.id_flux = f.id',
' group by m.id, m.modele')
;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
id | modele | test1 | test2
-: | :------------- | ----: | ----:
1 | renault captur | 1 | 1
2 | renault zoe | 0 | 0