...除了我是一个完全业余的事实?
我的表格设置如下:
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'
答案 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;
此查询假定同一患者的同一最大发送日期不会超过一条消息,否则,您将获得患者的多条记录。