Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 基于行值联接新列_Mysql_Sql - Fatal编程技术网

Mysql 基于行值联接新列

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

我有一张名为flux的桌子,上面有:

以及一个名为flux_rules的表,其中包含:

还有一个名为modele_scrape的表,其中包含:

我相信这是一个非常常见的设置,但我还没有找到关于我试图实现的内容的信息,这是一个SELECT查询,它将列出modele_scrape中的所有行,并为flux中的每一行指定一列,其中值由flux_规则第1列定义(如果存在),否则为0:

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