子查询结果使用IN子句MySQL返回逗号分隔值

时间:2013-11-07 07:21:46

标签: mysql sql in-subquery

友 两个表一个表是

CREATE TABLE `vbw_push_notifications` (
  `push_notification_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Primary key ,Auto increment field',
  `push_notification_customer_ids` text NOT NULL COMMENT 'comma separated customer id list which was used for messaging/related customers/broadcasting',
  `push_notification_message` varchar(500) NOT NULL COMMENT 'The notification message.(A new message from Veebow/A new message from <Merchant Name>/A new public deal <Deal Name> from <Merchant Name>/A new game deal <Deal Name> from <Merchant Name>',
  `push_notification_time` datetime NOT NULL,
  `push_notification_is_processed` tinyint(4) NOT NULL,
  PRIMARY KEY (`push_notification_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 COMMENT='The comma separated customer ids of the customers who needs ';

-- ----------------------------
-- Records of vbw_push_notifications
-- ----------------------------
INSERT INTO `vbw_push_notifications` VALUES ('1', '165836,65802,65829,65837,65838', 'test test test', '2013-11-07 12:36:42', '0');

我还有另一张表格,内容如下。

  CREATE TABLE `vbw_mobile_sessions` (
  `mobile_session_id` int(10) NOT NULL AUTO_INCREMENT COMMENT 'The unique identifier for a mobile session',
  `mobile_session_start_time` datetime DEFAULT NULL COMMENT 'The starting time @ server of a mobile session',
  `mobile_session_end_time` datetime DEFAULT NULL COMMENT 'The ending time @ server of a mobile session',
  `mobile_session_token` varchar(255) DEFAULT NULL COMMENT 'The mobile session token generated for this session',
  `mobile_session_device_id` varchar(50) DEFAULT NULL COMMENT 'The device id of the device used for making the session',
  `mobile_session_customer_id` int(10) DEFAULT NULL COMMENT 'The customer ID of the customer who made this session',
  `mobile_session_device_type` tinyint(4) DEFAULT NULL COMMENT 'The type of device that customer uses for this session. 0 - iOS, 1 - Android',
  PRIMARY KEY (`mobile_session_id`),
  KEY `fk_mobile_session_customer_id` (`mobile_session_customer_id`)
) ENGINE=InnoDB AUTO_INCREMENT=677 DEFAULT CHARSET=latin1 COMMENT='This table holds the merchant account activation links creat';

我想使用这样的子查询。

SELECT DISTINCT(mobile_session_customer_id)
FROM vbw_mobile_sessions
WHERE mobile_session_end_time IS null
AND mobile_session_customer_id IN (SELECT push_notification_customer_ids FROM vbw_push_notifications WHERE push_notification_id=6) .

此查询不返回零行。但是当我这样使用时,我得到了结果。

    SELECT DISTINCT(mobile_session_customer_id)
FROM vbw_mobile_sessions
WHERE mobile_session_end_time IS null
AND mobile_session_customer_id IN ( SELECT DISTINCT(mobile_session_customer_id)
FROM vbw_mobile_sessions
WHERE mobile_session_end_time IS null
AND mobile_session_customer_id IN (65836,65802,65829,65837,65838)

我认为子查询以不同的格式返回结果。你能指出我犯的错误吗?非常感谢。

2 个答案:

答案 0 :(得分:1)

你的回答很明显。 字符串 'a,b,c,d'值集 (a,b,c,d)无关。这不是它的工作方式。

正确的解决方案是在一个字段中不使用分隔符分隔值。您应该规范化数据库结构并创建链接表。然后将值放入其中,并使用子查询构建查询,并从中进行选择。

另一种可能的解决方案是从应用程序中的字段中选择数据(字符串数据),然后用分隔符拆分并替换为另一个查询。

答案 1 :(得分:0)

子查询返回一个值为'1,2,3'的varchar,你需要一组1,2,3..的整数。

引擎将子查询的结果视为varchar()而不是一组整数。

您可以浏览this question, asking exactly what you need