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によると、show columnsなどの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 に答える