Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 获取特定行上其值等于1的所有列名称_Php_Mysql_Sql - Fatal编程技术网

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

Php 获取特定行上其值等于1的所有列名称,php,mysql,sql,Php,Mysql,Sql,我只是想知道是否有一个简单的语句来获取一行中等于定义值的所有列 我有一个代表用户权限的表 e、 g 我需要一个查询,返回值为1的用户的所有列 对于用户2,结果如下所示 “右A”、“右C”、“右D” 目前,我加载完整的行并迭代结果以获得列名,但我希望在查询中直接这样做 根据MySQL,ShowColumns等中的where子句只测试名称,而不测试特定行的值 从结果中筛选出非1的所有值的查询也会有所帮助,但我必须在不知道所有列名的情况下工作:-/ 也许过程是一种选择,但这只是将代码从php外包到my

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

我有一个代表用户权限的表

e、 g

我需要一个查询,返回值为1的用户的所有列

对于用户2,结果如下所示

“右A”、“右C”、“右D”

目前,我加载完整的行并迭代结果以获得列名,但我希望在查询中直接这样做

根据MySQL,ShowColumns等中的where子句只测试名称,而不测试特定行的值

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

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

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


提前感谢!:)

既然您提到您正在使用
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;

因此,所需的结果是每行有一个单独的
varchar
,列名列表用逗号分隔?实际上这是一个tinyint,但我认为这无关紧要,只要我得到符合定义行中值的列名是,列的类型是
tinyint
,但是您想更改列名。啊,对不起,误解了。:)最好的结果是一个可以用php处理的mysql资源,但是一个varchar也很好,而且我认为我必须分解ist,还必须迭代。为什么不简单地规范化数据呢?谢谢!但正如我提到的,它必须在不知道所有列名的情况下工作。除此之外,目前有超过50列,我的客户希望对所有内容进行全面控制……而且我只是懒惰:p“除此之外,目前还有超过50列”啊哦。@Danack是的。这是一个很大的CMS,不是我的错,我只是必须处理这个问题的人:(@JW:omg!!!真的非常感谢!我现在有点准时,但今天晚些时候我会测试它。没想到有人会想出这样的方法:Dit完全有效!!!再次感谢,即使我完全不知道这段代码在做什么。也许是时候再次访问我的DB类了。。。。。
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;