繁体   English   中英

来自第一个表的五个表,如果存在则与来自第五个表的最大值的其他表连接

[英]Five tables all from first table, join others with max value from 5th table when exists

我有五张桌子:

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_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

目前尚不清楚您要做什么。 具体来说...您是否想要使用mailing_type_id = 1的邮件的最大date_mailed,如果有的话...还是您想要与使用mailing_type_id = 1的邮件相关的人员的最大日期,如果是,那么,则要他们使用任何邮件的最大date_mailed有关系吗?

我在查询中注意到的一些问题是:

  • 对邮件表的双重引用,具有相同的别名...不明确
  • MAX,没有GROUP BY,但有DISTINCT ...这有点尴尬
  • MAX(DATE_FORMAT(...)),为什么? 您的date_mailed列是什么类型?

这里有一些查询可能会解决您的问题,具体取决于您想要什么。

以下内容将仅返回与任何类型为1的邮件相关的人员,并仅为您提供最大类型为1的邮件的date_mailed。mailing_type的条件可以在ON子句或WHERE子句中。 没关系 但是请注意,在将条件放在RIGHT表的字段上时,LEFT JOIN是无用的:

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的所有人员,以及所有mailing_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

您还可以提出其他变体...这实际上取决于您想要的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM