1

行のフィールドが に等しいときに列名を取得しようとして、いくつかの SQL クエリをいじっています1

私のテーブルは次のようになります。

user  | col 1 | col 2 | col 3 | col 4 |
user1 |    1  |    1  |     0 |    1  |
user2 |    0  |    1  |     1 |    1  |
user3 |    1  |    0  |     0 |    1  |

各値が に等しい場合に表示する各列名を取得しようとしています1

SELECT ColNames
FROM table
WHERE user1 = 1
4

3 に答える 3

2

データベースを正規化してください!

user  | n | value
user1 | 1 | 1
user1 | 2 | 1
user1 | 3 | 0
user1 | 4 | 1
user2 | 1 | 0 
user2 | 2 | 1
user2 | 3 | 1 
user2 | 4 | 1 
user3 | 1 | 1 
user3 | 2 | 0 
user3 | 3 | 0
user3 | 4 | 1 

今では簡単です!

SELECT n
FROM users
WHERE user = 'user1' AND value = 1
于 2012-06-25T20:06:22.850 に答える
1

上記のように、3つのテーブルが必要です。1つはユーザー用、もう1つはアイテム用、もう1つは2つを結合するものです。ユーザー定義のメーリングリストを維持しながら、同様の機能に使用する構造とクエリは次のとおりです。

CREATE TABLE `tbl_listmembers` (
`listmem_id` int(11) NOT NULL AUTO_INCREMENT,
`list_id` int(11) NOT NULL,
 `user_id` int(11) NOT NULL,


CREATE TABLE `tbl_lists` (
`list_id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`list_name` varchar(45) DEFAULT NULL,
`list_description` varchar(250) DEFAULT NULL,


CREATE TABLE `tbl_user_accounts` (
 `user_id` int(11) NOT NULL AUTO_INCREMENT,
 `user_first_name` varchar(45) NOT NULL,
 `user_last_name` varchar(45) NOT NULL,

そして、特定のリストからメンバーをプルアップするクエリ:

SELECT lm.list_id, lm.user_id, ua.user_first_name, ua.user_last_name, ua.user_id
FROM test.tbl_listmembers AS lm 
LEFT JOIN test.tbl_user_accounts AS ua ON (ua.user_id = lm.user_id)
WHERE (lm.list_id = combo_box_selected_listnumber)

お役に立てば幸いです。

于 2012-06-25T21:09:04.283 に答える
0

できるよ

select case when col1=1 then 'Col 1' else '' end +
    case when col2=1 then 'Col 2' else '' end + 
    case when col3=1 then 'Col 3' else '' end + 
    case when col4=1 then 'Col 4' else '' end 
from users
where user = 'user1'

編集: おっと、これはトランザクション SQL 用です。mysql が同じcase構造を持っているかどうかはわかりません。

于 2012-06-25T20:11:37.313 に答える