这个内部查询有什么问题(MySQL)

时间:2010-04-01 12:43:20

标签: sql mysql

...除了我是一个完全业余的事实?

我的表格设置如下:

CREATE TABLE `messages` (
 `id` int(6) unsigned NOT NULL AUTO_INCREMENT,
 `patient_id` int(6) unsigned NOT NULL,
 `message` varchar(255) NOT NULL,
 `savedate` int(10) unsigned NOT NULL,
 `senddate` int(10) unsigned NOT NULL,
 `SmsSid` varchar(40) NOT NULL COMMENT 'where we store the cookies
from twilio',
 `sendorder` tinyint(3) unsigned NOT NULL COMMENT 'the order we want
the msg sent in',
 `sent` tinyint(1) NOT NULL COMMENT '0=queued, 1=sent,
2=sent-unqueued,4=rec-unread,5=recd-read',
 PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=143 ;

我需要一个

的查询
SELECT * FROM `messages` WHERE `senddate` < $now AND `sent` = 0 (AND LIMIT
TO ONLY ONE RECORD PER `patient_id`)

我尝试了以下内容:

SELECT * 
FROM `messages`
WHERE `senddate` IN 
    (SELECT `patient_id`, max(`senddate`)
     GROUP by `patient_id`) 
AND `senddate` < $now AND `sent` = 0 ;

但是我收到了这个错误: MySQL客户端版本:5.1.37

  

`#1064 - 你的SQL语法有错误;检查手册   对应于您的MySQL服务器   用于正确语法的版本   靠近'GROUP by patient_id)AND   senddate&lt; 1270093898 AND sent = 0   在第5行限制0,30'

7 个答案:

答案 0 :(得分:3)

除了在子查询中缺少FROM子句之外,IN子句将期望子查询中的单个列。您正在选择两个列。

将子查询更改为具有FROM子句,并仅返回预期列:

SELECT * 
FROM `messages`
WHERE `senddate` IN 
    (SELECT max(`senddate`)
     FROM `patients`
     GROUP by `patient_id`) 
AND `senddate` < $now AND `sent` = 0 ;

答案 1 :(得分:2)

您在内部SELECT语句中缺少FROM子句。它应该是:

SELECT `patient_id`, max(`senddate`) FROM messages
     GROUP by `patient_id`

答案 2 :(得分:2)

此查询应返回每patient_id条一条记录,同时保留初始查询包含的条件:

SELECT `patient_id`, max(`senddate`)
FROM `messages`
WHERE `senddate` < $now AND `sent` = 0
GROUP BY `patient_id`

答案 3 :(得分:2)

我的mySQL语法知识并不存在(我更喜欢SQL Server),但希望如果我有点错误,你会看到我正在尝试做的事情!

SELECT m.*
FROM `messages` m
    JOIN 
    (
        SELECT patient_id, MAX(senddate) AS latestsenddate
        FROM `messages'
        WHERE `senddate` < $now AND `sent` = 0
    ) m2 ON m.patient_id = m2.patient_id AND m.senddate = m2.latestsenddate

这种方法意味着您可以从邮件中返回所有列,并假设患者不会有多条具有相同最新发送日期的邮件。

答案 4 :(得分:0)

最终版本:

SELECT * , MIN(  `senddate` ) 
FROM  `messages` 
WHERE  `senddate` < $now
AND  `sent` =0
GROUP BY  `patient_id`

答案 5 :(得分:0)

怎么样?

SELECT * 
FROM `messages`
WHERE `id` IN 
    (SELECT p1.id
     FROM `messages` p1 
       JOIN (SELECT `patient_id`, max(`senddate`) maxdate
             FROM `messages`
             GROUP by `patient_id`)  p2
       ON (p1.patient_id = p2.patient_id
           AND p1.senddate = p2.maxdate))
AND `senddate` < $now AND `sent` = 0 ;

答案 6 :(得分:0)

你几乎拥有它。

您只是缺少子查询中的FROM子句和WHERE子句中的patient_id列。

SELECT * 
FROM `messages`
WHERE (`patient_id`, `senddate`) IN 
    (SELECT `patient_id`, max(`senddate`) FROM `messages`
     GROUP by `patient_id`) 
AND `senddate` < $now AND `sent` = 0;

此查询假定同一患者的同一最大发送日期不会超过一条消息,否则,您将获得患者的多条记录。