我有五张桌子:
人
person_id (pk)
lname
fname
address
person_category
persCatID (pk)
category_id
person_id
构件
member_id (pk)
person_id
expires
mailing_person
mailing_id
person_id
flag_mailed
邮件
mailing_id (pk)
mailing_type_id
date_mailed
flag_mailed
date_entry
我希望 person 表中的所有值在person_category中的category_id = 1 并且在邮寄mailing_type_id = 1时,成员在成员时到期,person_id =人员表person_id,如果在mailing_person中存在特定person_id的mailing_id,则从邮件获取date_mailed。
Mailing_person包含多对多,因为参与者可以在mailing_person中有许多不同类型的条目,我只想要date_entry最新的条目。
这是我的查询,但我没有得到任何结果:
SELECT distinct p.person_id, fname_mi, lname,
company_name, addr1, addr2, city, st, zip,
greeting, email, expires,
MAX(DATE_FORMAT(date_mailed,'%m/%d/%Y')) as mailingDate
FROM person p, mailing g
INNER JOIN person_category c ON c.person_id = p.person_id
INNER JOIN member m ON m.person_id = p.person_id
LEFT JOIN mailing_person i ON i.person_id = p.person_id
LEFT JOIN mailing g on g.mailing_id = i.mailing_id
WHERE category_id = 1
and mailing_type_id = 1
答案 0 :(得分:1)
你要做的事情并不是很清楚。具体来说......你想要mail_type_id = 1的邮件的最大date_mailed,如果有的话...或者你想要与mail_type_id = 1的邮件相关的人,如果是,那么任何邮件的最大date_mailed他们与?有关?
我在您的查询中发现的一些问题是:
以下是一些可以解决您的问题的查询,具体取决于您想要的内容。
以下内容仅返回与type = 1的任何邮件相关的人员,并且只会给出类型为1的邮件的最大日期_邮件.winget_type上的条件可以在ON子句或WHERE子句中。没关系。但请注意,LEFT JOIN是没用的,因为你在RIGHT表的字段上放了一个条件:
SELECT
p.person_id,
p.fname,
p.lname,
p.company_name,
p.addr1,
p.addr2,
p.city,
p.st,
p.zip,
p.greeting,
p.email,
m.expires,
MAX(m.date_mailed) AS max_date_mailed
FROM person p
JOIN member m ON m.person_id = p.person_id
JOIN person_category pc ON pc.person_id = p.person_id
JOIN mailing_person mp ON mp.person_id = p.person_id
JOIN mailing g ON g.mailing_id = mp.mailing_id
WHERE pc.category_id = 1 AND g.mailing_type_id = 1
GROUP BY
p.person_id,
p.fname,
p.lname,
p.company_name,
p.addr1,
p.addr2,
p.city,
p.st,
p.zip,
p.greeting,
p.email,
m.expires
以下查询使用SUBSELECT,但做了不同的事情。它返回category_id = 1的所有人,以及mail_type = 1的任何邮件的最大date_mailed:
SELECT
p.person_id,
p.fname,
p.lname,
p.company_name,
p.addr1,
p.addr2,
p.city,
p.st,
p.zip,
p.greeting,
p.email,
m.expires,
(SELECT MAX(g.date_mailed)
FROM mailing g
JOIN mailing_person mp ON mp.mailing_id = g.mailing_id
WHERE mp.person_id = p.person_id AND g.mailing_type=1
) AS max_date_mailed
FROM person p
JOIN member m ON m.person_id = p.person_id
JOIN person_category pc ON pc.person_id = p.person_id
WHERE pc.category_id = 1
您还可以提出其他变体......这实际上取决于您的需求。