2010-10-13 2 views
0

Я использую этот запросMySQL неизвестный столбец

SELECT COUNT(DISTINCT to_number) AS errors FROM sent_txts 
WHERE msg_link_id = 0 AND 
msg_sent_datetime BETWEEN '2010-08-09 07:00:00' AND '2010-09-07 11:59:59' 
HAVING to_number IN(SELECT mobile FROM action_6_members WHERE mobile = to_number) 

Однако я получаю

Неизвестный столбец 'tada_prod.sent_txts.to_number' в 'где предложение'

Если я комментируйте, что запрос выполняется нормально.

Вот таблица sent_txts

CREATE TABLE `sent_txts` (
    `id` int(64) NOT NULL AUTO_INCREMENT, 
    `msg_link_id` int(64) DEFAULT NULL, 
    `msg_class` varchar(256) DEFAULT NULL, 
    `msg_ref` varchar(256) DEFAULT NULL, 
    `to_number` varchar(256) DEFAULT NULL, 
    `msg_body` text, 
    `waiting_for_reply` int(64) DEFAULT NULL, 
    `status` varchar(256) DEFAULT NULL, 
    `tada_error` int(64) DEFAULT NULL, 
    `msg_sent_datetime` datetime DEFAULT NULL, 
    `reply_type` int(11) DEFAULT '0', 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=256379 DEFAULT CHARSET=utf8 

Так, очевидно, колонка есть.

В чем проблема?


Вот это объяснить запроса разместил Ионафана

 
id select_type table type possible_keys key key_len ref rows Extra       
1 SIMPLE  a  ALL          10895         
1 SIMPLE  s  ALL          256050 Using where; Using join buffer 

Вот шоу создать для action_6_members:

CREATE TABLE `action_6_members` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `draw_id` int(11) NOT NULL, 
    `mobile` varchar(255) NOT NULL, 
    `fly_buys` varchar(255) NOT NULL, 
    `signup_date` datetime NOT NULL, 
    `club` int(11) NOT NULL DEFAULT '0' COMMENT '1 = yes, 2 = no', 
    `code` varchar(7) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=10896 DEFAULT CHARSET=latin1 

ответ

1

Обычно HAVING статья относится совокупность к стоимости или другой агрегат. Что находится в HAVING пункте вопроса должно быть в основном ИНЕКЕ:

SELECT COUNT(DISTINCT to_number) AS errors 
    FROM sent_txts AS s 
WHERE msg_link_id = 0 
    AND msg_sent_datetime BETWEEN '2010-08-09 07:00:00' 
          AND '2010-09-07 11:59:59' 
    AND to_number IN (SELECT mobile FROM action_6_members AS a 
         WHERE a.mobile = s.to_number) 

Но вы, вероятно, следует сделать это в обычный присоединиться:

SELECT COUNT(DISTINCT s.to_number) AS errors 
    FROM sent_txts AS s 
    JOIN action_6_members AS a ON a.mobile = s.to_number 
WHERE s.msg_link_id = 0 
    AND s.msg_sent_datetime BETWEEN '2010-08-09 07:00:00' 
           AND '2010-09-07 11:59:59'; 
+0

+1: Вы меня бить; Я работал над примером, используя EXISTS. JOIN для 'action_6_members' рискует раздувать записи, если есть несколько дочерних элементов, связанных с родительской записью. –

+0

@OMG: но DISTINCT уничтожает любой из этих повреждений, не так ли? Кроме того, я думаю, что люди «Action 6» находятся в специальном тарифном плане (мобильный телефон), и это подсчитывает количество звонков, отправленных между двумя датами людям в плане Action 6, поэтому будет только один номер (не более) в таблице Action 6 для любого заданного «to_number». –

+0

hmm, не очень нравится присоединяется, но нормально :) Просто инсус, этот запрос должен в основном выбирать все уникальные мобильные (to_number) из таблицы sent_txts (на основе того, где), но только считать, если число существует в action_6_members, вы можете видеть лучший способ? – Hailwood