【发布时间】:2012-04-16 08:40:46
【问题描述】:
我在 SO 和网络上搜索了许多资源,试图找出我的 MySQL select 语句没有返回正确的行/结果的原因。如果这里有我错过的答案,我提前道歉,并感谢有人向我指出。
一点背景。假设一个电子邮件活动应用程序具有以下表格:用户、组、活动、队列、managers_groups 和设置。每个组都有自己的设置,有一个名为“delivery_enabled”的标志 - 1 或 0。重要的一点是,当一个组由另一个组管理时,“managee”组将自动使用管理组的设置。因此,即使“managee”组的设置将 delivery_enabled 设置为 1,并且他们的管理组设置为 0,他们的设置也将被视为 0。我希望我解释清楚:/
以下语句用于从表“队列”返回行 - 队列保存等待应用程序传递的消息/电子邮件。该语句检查用户的组 settings.delivery_enabled = 1 - 考虑(通过 CASE)我们是应该使用用户自己的组设置还是他们管理组的设置。
SELECT
t1.*
FROM
queue t1,
campaigns t2,
users t3,
managers_groups t4,
settings t5
WHERE
( t1.campaign_status = 3 && t1.campaign_id = t2.id && t2.user_id = t3.id && t5.delivery_enabled = 1 ) &&
CASE ( SELECT 1 FROM managers_groups WHERE managee_group_id = t3.group_id )
WHEN 1 THEN t4.manager_group_id = t5.group_id
ELSE t3.group_id = t5.group_id
END
GROUP BY t1.id
ORDER BY t1.send_at ASC, t1.id ASC
我得到的结果表明,拥有管理组的组仍然使用他们自己的设置,而不是管理组的设置。我觉得 WHERE CLAUSE 中的 CASE 语句有问题,导致查询回退到 ELSE。
如果有人想尝试一下,这是我正在使用的数据。
CREATE TABLE IF NOT EXISTS `campaigns` (
`id` int(12) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(12) NOT NULL,
`name` varchar(150) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ;
--
-- Dumping data for table `campaigns`
--
INSERT INTO `campaigns` (`id`, `user_id`, `name`) VALUES
(16, 72, 'Steve''s Campaign'),
(13, 83, 'Kelly''s Campaign'),
(14, 77, 'Narek''s Campaign'),
(15, 75, 'Cynthia''s Campaign');
-- --------------------------------------------------------
--
-- Table structure for table `groups`
--
CREATE TABLE IF NOT EXISTS `groups` (
`id` int(12) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(150) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=110 ;
--
-- Dumping data for table `groups`
--
INSERT INTO `groups` (`id`, `name`) VALUES
(108, 'Managers 002'),
(107, 'Managers 001'),
(106, 'Members 001 - Group B'),
(104, 'Members 002 - Group A'),
(103, 'Members 001 - Group A');
-- --------------------------------------------------------
--
-- Table structure for table `managers_groups`
--
CREATE TABLE IF NOT EXISTS `managers_groups` (
`id` int(12) unsigned NOT NULL AUTO_INCREMENT,
`manager_group_id` int(12) NOT NULL,
`managee_group_id` int(12) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=280 ;
--
-- Dumping data for table `managers_groups`
--
INSERT INTO `managers_groups` (`id`, `manager_group_id`, `managee_group_id`) VALUES
(274, 108, 104),
(279, 107, 103);
-- --------------------------------------------------------
--
-- Table structure for table `queue`
--
CREATE TABLE IF NOT EXISTS `queue` (
`id` int(12) NOT NULL AUTO_INCREMENT,
`campaign_id` int(12) NOT NULL,
`campaign_status` int(2) NOT NULL DEFAULT '0',
`send_at` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=20 ;
--
-- Dumping data for table `queue`
--
INSERT INTO `queue` (`id`, `campaign_id`, `campaign_status`, `send_at`) VALUES
(1, 16, 3, '2012-04-01 20:05:45'),
(2, 16, 3, '2012-04-01 20:05:45'),
(3, 16, 3, '2012-04-01 20:05:45'),
(4, 16, 3, '2012-04-01 20:05:45'),
(5, 15, 3, '2012-04-01 20:00:18'),
(6, 15, 3, '2012-04-01 20:00:18'),
(7, 15, 3, '2012-04-01 20:00:18'),
(8, 15, 3, '2012-04-01 20:00:18'),
(9, 15, 3, '2012-04-01 20:00:18'),
(10, 15, 3, '2012-04-01 20:00:18'),
(11, 15, 3, '2012-04-01 20:00:18'),
(12, 14, 3, '2012-04-01 20:00:06'),
(13, 14, 3, '2012-04-01 20:00:06'),
(14, 14, 3, '2012-04-01 20:00:06'),
(15, 14, 3, '2012-04-01 20:00:06'),
(16, 14, 3, '2012-04-01 20:00:06'),
(17, 14, 3, '2012-04-01 20:00:06'),
(18, 13, 3, '2012-04-01 19:59:53'),
(19, 13, 3, '2012-04-01 19:59:53');
-- --------------------------------------------------------
--
-- Table structure for table `settings`
--
CREATE TABLE IF NOT EXISTS `settings` (
`id` int(12) unsigned NOT NULL AUTO_INCREMENT,
`group_id` int(12) unsigned NOT NULL,
`delivery_enabled` int(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=22 ;
--
-- Dumping data for table `settings`
--
INSERT INTO `settings` (`id`, `group_id`, `delivery_enabled`) VALUES
(19, 107, 1),
(20, 108, 0),
(18, 106, 0),
(16, 104, 1),
(15, 103, 1);
-- --------------------------------------------------------
--
-- Table structure for table `users`
--
CREATE TABLE IF NOT EXISTS `users` (
`id` int(12) unsigned NOT NULL AUTO_INCREMENT,
`group_id` int(12) NOT NULL,
`username` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=86 ;
--
-- Dumping data for table `users`
--
INSERT INTO `users` (`id`, `group_id`, `username`) VALUES
(83, 106, 'kelly'),
(77, 104, 'narek'),
(75, 104, 'cynthia'),
(72, 103, 'steve');
还有一点需要注意的是,我确实尝试了一个缩减版本,它只有三个表和更少的数据,这似乎工作正常,但是一旦我在更大的场景中使用了相同的方法(有更多的表可供参考)它没用。
如果需要更多信息,请告诉我。
【问题讨论】: