2013-11-07 4 views
0

Друзья, две таблицы одна таблицаSubquery результат возвращения значения, разделенные запятыми, используя в разделе MySQL

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) 

Я думаю, что его в другом формате подзапрос возвращает результат. Не могли бы вы указать на ошибку, которую я совершил. Большое спасибо.

+1

Возможно, вы увидите лучшую разницу со строками: существует большая разница между 'IN ('A', 'B', 'C')' и 'IN ('A, B, C')' –

+1

Попробуйте используйте [FIND_IN_SET] (http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set) вместо IN – valex

ответ

0

Ваш ответ очевиден. String'a,b,c,d' не имеет отношения к набор значений(a,b,c,d). Это не так, как это сработает.

Правильное решение: Не использовать значения, разделенные разделителем, в одном поле. Вы должны нормализовать структуру БД и создать таблицу связывания. Затем поместите в него свои значения и постройте свой запрос с помощью подзапроса, выбрав его.

Еще одно возможное решение - выбрать ваши данные (строковые данные) из вашего поля в приложении, разделить его на разделитель и заменить на другой запрос.

0

Подзапрос возвращает вам varchar со значением '1,2,3' и вам нужен набор целых чисел, который составляет 1,2,3...

Двигатель обрабатывает ваш результат подзапроса как varchar(), а не набор целых чисел.

Вы можете пройти через this question, asking exactly what you need

 Смежные вопросы

  • Нет связанных вопросов^_^