2

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

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

例如

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,显示列等中的 where 子句仅测试名称,而不测试特定行的值。

从非 1 的结果中过滤出所有值的查询也会有所帮助,但我必须在不知道所有列名的情况下工作:-/

也许程序是一种选择,但这只是将代码从 php 外包到 mysql :-/

有什么想法或完全不可能吗?

预先感谢!:)

4

1 回答 1

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;
于 2013-01-28T11:55:29.800 回答