1

次の構造のテーブルがあります。

CREATE TABLE IF NOT EXISTS `user_settings` (
  `user_ID` smallint(6) unsigned NOT NULL,
  `item` varchar(50) NOT NULL,
  `value` text,
  `app_ID` tinyint(4) NOT NULL DEFAULT '0',
  KEY `user_ID` (`user_ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

# With these data

INSERT INTO `user_settings` (`user_ID`, `item`, `value`, `app_ID`) VALUES
(3, 'statusTrainer_ID', '0', 0),
(3, 'enabledApp', '1', 0),
(3, 'enabled_office_ID', '1', 1),
(3, 'enabled_office_ID', '2', 1),
(4, 'statusTrainer_ID', '1', 0),
(1, 'enabledApp', '1', 0),
(1, 'salesCode_ID_add', '1', 1),
(1, 'salesCode_ID_add', '2', 1),
(1, 'salesCode_ID_add', '3', 1),
(1, 'salesCode_ID_add', '20', 1),
(1, 'salesCode_ID_process', '2', 1),
(1, 'salesCode_ID_process', '3', 1),
(1, 'salesCode_ID_process', '20', 1);

データフィルタリングのためにこのクエリを実行したい

SELECT `user_ID`
FROM (`user_settings`)
WHERE (
`item` =  'enabledApp'
 AND 
`value` IN ('1') 
)
 AND 
(
`item` =  'statusTrainer_ID'
 AND 
`value` IN ('0') 
)

結果として '3' を期待していますが、MYSQL は空のセットを返します。どうして??ご回答ありがとうございます。

更新しました

サブクエリで解決しました

SELECT distinct `user_ID`
FROM (`user_settings`)
WHERE user_ID IN(
SELECT `user_ID`
FROM (`user_settings`)
WHERE (
item =  'enabledApp'
 AND 
value IN (1) 
))

AND user_ID IN(SELECT `user_ID`
FROM (`user_settings`)
WHERE (
item =  'statusTrainer_ID'
 AND 
value IN (0) 
))

デモ

しかし、それは少し複雑です...もっとクリーンな解決策はありますか????

4

1 に答える 1

1

またはが必要です。

SELECT `user_ID`
FROM (`user_settings`)
WHERE ( `item` =  'enabledApp'  AND  `value` IN ('1')  )  OR
      ( `item` =  'statusTrainer_ID'  AND  `value` IN ('0')  ) 

item を「enabledApp」と「statusTrainer_ID」の両方にすることはできないため、空のセットが返されました。

ああ、あなたは両方を持つユーザー ID を取得しようとしています。このようにしてください:

SELECT `user_ID`
FROM `user_settings`
GROUP BY `user_ID`
HAVING max(case when `item` =  'enabledApp'  AND  `value` IN ('1') then 1 else 0 end) = 1 and
       max(case when  `item` =  'statusTrainer_ID'  AND  `value` IN ('0') then 1 else 0 end) = 1

デモ

于 2012-06-22T15:55:10.130 に答える