从 MYSQL 数据透视表 table 过滤记录
Filter records from MYSQL Pivot table
我有这个查询,http://sqlfiddle.com/#!9/1a579/3
我是使用动态查询构建的。需要知道如何从中过滤记录。我需要将此查询的结果视为 table。让我们说 CustomUser table。所以我需要像下面解释的那样查询这个table。
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 table,我需要 运行 像
这样的查询
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%'
您可以用子查询包装它并进行任何您需要的过滤:
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;
您还可以将条件提取到第二个变量并连接:
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
我有这个查询,http://sqlfiddle.com/#!9/1a579/3
我是使用动态查询构建的。需要知道如何从中过滤记录。我需要将此查询的结果视为 table。让我们说 CustomUser table。所以我需要像下面解释的那样查询这个table。
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 table,我需要 运行 像
这样的查询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%'
您可以用子查询包装它并进行任何您需要的过滤:
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;
您还可以将条件提取到第二个变量并连接:
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