我觉得我以前做过这个,但错过了一些东西。我正在浏览我继承的数据库,并希望看到一堆 DISTINCT 值。我想我可以做这样的事情,而不是写很多次cf_840(或任何数字(,然后在一个地方更改实际的字段名称......
SET @var = 'cf_840';
SELECT DISTINCT @var, COUNT(@var) AS counter
FROM vtiger_leadscf
GROUP BY @var
ORDER BY @var;
但这不起作用,我觉得我错过了一些简单的东西,但找不到正确的东西来搜索 SO。
不能使用变量直接指定动态构造查询之外的字段;充其量只能有条件地从字段中选择一个值,例如CASE @var WHEN 840 THEN cf_840 WHEN 1 THEN cf_1 .... etc END AS fieldVal
否则,您需要将字段名称"baked"动态构造到要执行的查询中。
C# 样式:var query = String.Format("SELECT {0}, COUNT(DISTINCT {0}) AS counter FROM .... blah blah blah", fieldName);
SQL 处理样式:SET query := 'SELECT ' + fieldName + ', COUNT(DISTINCT ' + fieldName.....and so on
,然后准备并执行。
编辑:我不确定为什么要选择@var,如果你得到它的值计数。我猜您希望结果中包含字段名称,所以也许示例会更好,因为
SELECT '{0}' as theField, COUNT(DISTINCT {0}) AS counter ...
和"选择"+字段名称+"作为字段名称,计数(不同"+字段名称....">
此外,您不需要 GROUP BY 或 ORDER BY 子句,这些查询将只有一个结果行。
要在当前查询中使用变量,请在 SELECT 的正文中声明该变量
SELECT DISTINCT @var := 'cf_840' AS fieldName, COUNT(@var) AS counter
FROM vtiger_leadscf
GROUP BY fieldName
ORDER BY counter;