【问题标题】:Filter records from MYSQL Pivot table从 MYSQL Pivot 表中过滤记录
【发布时间】:2015-11-12 10:03:02
【问题描述】:

我有这个问题,http://sqlfiddle.com/#!9/1a579/3

我使用动态查询构建了它。需要知道如何从中过滤记录。我需要将此查询的结果视为一个表。让我们说 CustomUser 表。所以我需要像下面解释的那样查询这个表。

SET @Colvalues = NULL;
SET @sql = NULL;

SELECT
  GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(f.fieldName = ''',
      f.fieldName, ''', COALESCE(v.fieldValue, f.defaultValue) , NULL)) AS ', '''', f.fieldName , '''')
  ) INTO @Colvalues
FROM customField AS f
INNER JOIN Customvalue AS v ON f.Id = v.customFieldId;


SET @sql = CONCAT('SELECT 
    u.*, v.relatedId, v.CreatedAt, ', @Colvalues , '
FROM customField AS f
INNER JOIN Customvalue AS v ON f.Id = v.customFieldId RIGHT JOIN User u on u.id = v.relatedId
GROUP BY   v.relatedId, v.CreatedAt;');

PREPARE stmt 
FROM @sql;

EXECUTE stmt;

这个结果有以下数据,

现在将其视为 CustomUser 表,我需要运行类似

的查询
select * from CustomUser where HOMEEMAIL like '%ab%' and JOINDATE like '%2010%' and SCHOOLING? like '%1%'

select * from CustomUser where HOMEEMAIL like '%ab%' and JOINDATE like '%2010%' and SCHOOLING? like '%1%' and LANDPHONENO? like '%0112%'

【问题讨论】:

    标签: php mysql sql phpmyadmin


    【解决方案1】:

    你可以用子查询包装它并进行任何你需要的过滤:

    SET @Colvalues = NULL;
    SET @sql = NULL;
    
    SELECT
      GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(f.fieldName = ''',
          f.fieldName, ''', COALESCE(v.fieldValue, f.defaultValue) , NULL)) AS ', '''', f.fieldName , '''')
      ) INTO @Colvalues
    FROM customField AS f
    INNER JOIN Customvalue AS v ON f.Id = v.customFieldId;
    
    
    SET @sql = CONCAT('SELECT * FROM (SELECT 
        u.*, v.relatedId, v.CreatedAt, ', @Colvalues , '
    FROM customField AS f
    INNER JOIN Customvalue AS v ON f.Id = v.customFieldId RIGHT JOIN User u on u.id = v.relatedId
    GROUP BY   v.relatedId, v.CreatedAt)
    AS s WHERE s.Homeemail = 456;');   -- here
    
    PREPARE stmt 
    FROM @sql;
    
    EXECUTE stmt;
    

    SqlFiddleDemo

    您还可以将条件提取到第二个变量并连接:

    SET @conditions = NULL;
    SET @conditions = CASE WHEN @conditions IS NULL THEN '1 = 1' ELSE @conditions END
    
    SET @sql = CONCAT('SELECT * FROM (SELECT 
            u.*, v.relatedId, v.CreatedAt, ', @Colvalues , '
        FROM customField AS f
        INNER JOIN Customvalue AS v ON f.Id = v.customFieldId RIGHT JOIN User u on u.id = v.relatedId
        GROUP BY   v.relatedId, v.CreatedAt)
        AS s WHERE ',  @conditions);   -- here
    

    【讨论】:

      猜你喜欢
      • 2015-11-20
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-26
      • 2013-01-10
      相关资源
      最近更新 更多