Mysql 帮助将此sql查询转换为“JOIN”语法
我是SQL新手。有人可以帮助转换此查询,使其使用联接语法吗Mysql 帮助将此sql查询转换为“JOIN”语法,mysql,sql,join,Mysql,Sql,Join,我是SQL新手。有人可以帮助转换此查询,使其使用联接语法吗 SELECT groups.name, users.firstname, users.lastname, users.emailaddress, groupmembers.userid, reminders.groupid, reminders.ownerid, reminderdetails.recno, reminderd
SELECT groups.name,
users.firstname,
users.lastname,
users.emailaddress,
groupmembers.userid,
reminders.groupid,
reminders.ownerid,
reminderdetails.recno,
reminderdetails.cardid,
reminderdetails.message
FROM reminderdetails,
reminders,
groupmembers,
users,
groups
WHERE assocdate = 'Y'
AND ( reminder1 != 99
AND ( Datediff(reminderdate, '2011-09-22') = reminder1 )
OR ( reminder2 != 99
AND Datediff(reminderdate, '2011-09-22') = reminder2 ) )
AND reminders.cardid = reminderdetails.cardid
AND groupmembers.groupid = reminders.groupid
AND groupmembers.sendemail = 'Y'
AND users.recno = groupmembers.userid
AND groups.recno = reminders.groupid
试试这个:
SELECT g.name,
uu.firstname,
uu.lastname,
uu.emailaddress,
gp.userid,
rm.groupid,
rm.ownerid,
rd.recno,
rd.cardid,
rd.message
FROM reminderdetails rd
JOIN reminders rm on rm.cardid=rd.cardId
JOIN groupmembers gp on gp.groupid=rm.groupId and gp.sendemail='Y'
JOIN users uu on uu.recNo=gp.userId,
JOIN groups g ON g.recno=rm.groupId
WHERE assocdate = 'Y'
AND ( reminder1 != 99
AND ( Datediff(reminderdate, '2011-09-22') = reminder1 )
OR ( reminder2 != 99
AND Datediff(reminderdate, '2011-09-22') = reminder2 ) )
试试这个:
SELECT g.name,
uu.firstname,
uu.lastname,
uu.emailaddress,
gp.userid,
rm.groupid,
rm.ownerid,
rd.recno,
rd.cardid,
rd.message
FROM reminderdetails rd
JOIN reminders rm on rm.cardid=rd.cardId
JOIN groupmembers gp on gp.groupid=rm.groupId and gp.sendemail='Y'
JOIN users uu on uu.recNo=gp.userId,
JOIN groups g ON g.recno=rm.groupId
WHERE assocdate = 'Y'
AND ( reminder1 != 99
AND ( Datediff(reminderdate, '2011-09-22') = reminder1 )
OR ( reminder2 != 99
AND Datediff(reminderdate, '2011-09-22') = reminder2 ) )
在不知道你的桌子结构的情况下有点猜测,但我认为这似乎是正确的 编辑:刚刚看到另一个;我通常不希望在JOIN中加载太多的子句,因为当您想知道哪些子句被应用于何处时,您最终会四处寻找。如果可能的话,我认为最好让连接只包含连接,并将其余的放在WHERE中 我肯定有其他人会在那件事上向我开枪,但这是我的看法:
SELECT groups.name,
users.firstname,
users.lastname,
users.emailaddress,
groupmembers.userid,
reminders.groupid,
reminders.ownerid,
reminderdetails.recno,
reminderdetails.cardid,
reminderdetails.message
FROM groups
INNER JOIN groupmembers ON groups.groupid = groupmembers.groupid
INNER JOIN users ON groupmembers.userid = users.userid
INNER JOIN reminders ON users.userid = reminders.ownderid
INNER JOIN reminderdetails ON reminders.cardid = reminderdetails.cardid
WHERE assocdate = 'Y'
AND ( reminder1 != 99
AND ( Datediff(reminderdate, '2011-09-22') = reminder1 )
OR ( reminder2 != 99
AND Datediff(reminderdate, '2011-09-22') = reminder2 ) )
AND groupmembers.sendemail = 'Y'
在不知道你的桌子结构的情况下有点猜测,但我认为这似乎是正确的 编辑:刚刚看到另一个;我通常不希望在JOIN中加载太多的子句,因为当您想知道哪些子句被应用于何处时,您最终会四处寻找。如果可能的话,我认为最好让连接只包含连接,并将其余的放在WHERE中 我肯定有其他人会在那件事上向我开枪,但这是我的看法:
SELECT groups.name,
users.firstname,
users.lastname,
users.emailaddress,
groupmembers.userid,
reminders.groupid,
reminders.ownerid,
reminderdetails.recno,
reminderdetails.cardid,
reminderdetails.message
FROM groups
INNER JOIN groupmembers ON groups.groupid = groupmembers.groupid
INNER JOIN users ON groupmembers.userid = users.userid
INNER JOIN reminders ON users.userid = reminders.ownderid
INNER JOIN reminderdetails ON reminders.cardid = reminderdetails.cardid
WHERE assocdate = 'Y'
AND ( reminder1 != 99
AND ( Datediff(reminderdate, '2011-09-22') = reminder1 )
OR ( reminder2 != 99
AND Datediff(reminderdate, '2011-09-22') = reminder2 ) )
AND groupmembers.sendemail = 'Y'
什么是assocdate、rementer1、rementer2和rementerDate?我的意思是,它们都是变量吗?@Andrey:它们是表RemiderDetails中的列,分别是assocdate、rementer1、rementer2和rementerDate?我的意思是,它们都是变量吗?@Andriy:它们是表RemiderDetails中的列。我不确定MySQL是否允许在引用列时将表名与同一个表的别名混合使用,但无论如何,如果您为表定义了别名,为什么要改为使用原始名称?我说的是查询的SELECT子句中的引用。为完整起见,不,如果您对原始表名使用了别名,则不能使用原始表名。我认为这适用于任何别名;如果你给一列加别名,它的原始名称将不再可用,依此类推。@Joe:这取决于你的意思。例如,您可以在SELECT子句中为列添加别名,并仍然按原始名称按顺序引用它们。但是,如果您的意思是从外部选择访问子选择的列,那么是的,您只能通过别名而不是“真实”名称引用别名列。感谢您对表别名的确认。我不确定MySQL是否允许在引用列时将表名与同一个表的别名混合使用,但无论如何,如果您已经为表定义了别名,为什么要使用原始名称呢?我说的是查询的SELECT子句中的引用。为完整起见,不,如果您对原始表名使用了别名,则不能使用原始表名。我认为这适用于任何别名;如果你给一列加别名,它的原始名称将不再可用,依此类推。@Joe:这取决于你的意思。例如,您可以在SELECT子句中为列添加别名,并仍然按原始名称按顺序引用它们。但是,如果您的意思是从外部选择访问子选择的列,那么是的,您只能通过别名而不是“真实”名称引用别名列。感谢您对表别名的确认。