获取特定行上其值等于1的所有列名称

时间:2013-01-28 11:44:18

标签: php mysql sql

我只是想知道是否有一个简单的语句来使行的所有列都等于定义的值。

我有一张代表用户权利的表格。

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: - /

任何想法或完全不可能?

提前感谢! :)

1 个答案:

答案 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;