我只是想知道是否有一个简单的语句来使行的所有列都等于定义的值。
我有一张代表用户权利的表格。
e.g。
userid | right A | right B | right C | right D
----------------------------------------------
1 | 0 | 0 | 1 | 1
----------------------------------------------
2 | 1 | 0 | 1 | 1
----------------------------------------------
3 | 0 | 0 | 0 | 1
我需要一个查询,它返回一个值为1
的用户的所有列对于用户2,结果看起来像
'右A','右C','右D'
此刻我加载完整的行并迭代结果以获取列名称但我希望直接在我的查询中执行此操作。
根据MySQL,show columns等中的where子句仅测试名称,但不测试特定行的值。
从非结果的结果中过滤掉所有值的查询也会有所帮助,但我必须在不知道所有列名的情况下工作: - /
也许一个程序是一个选项,但这只是将代码从php外包到mysql: - /
任何想法或完全不可能?
提前感谢! :)
答案 0 :(得分:3)
由于您提到您使用的是MySQL
,因此您可以在此使用IF
SELECT CONCAT_WS(', ', IF(`right A` = 1, 'right A', NULL),
IF(`right B` = 1, 'right B', NULL),
IF(`right C` = 1, 'right C', NULL),
IF(`right D` = 1, 'right D', NULL)) columnList
FROM tableName
WHERE userID = 2
为50列创建动态sql ,例如
SET @dbaseName = (SELECT DATABASE()); // FILL DATABASE NAME HERE
SET @tableName = 'TableName'; // TableName
SET @userValue = 2; // value of UserID
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT('IF(`',COLUMN_NAME , '` = 1, ''',COLUMN_NAME,''', NULL)')
) INTO @sql
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = @dbaseName AND
COLUMN_NAME LIKE 'right%';
SET @sql = CONCAT('SELECT CONCAT_WS('', '',', @sql, ') AS ColumnList
FROM tableName
WHERE userid = ', @userValue);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;