mysql - 五个表均来自第一个表,如果存在,则将其他表与第五个表中的最大值连接起来

标签 mysql join max

我有五张 table :

person_id (pk) 
lname
fname 
address

person_category

persCatID (pk)
category_id
person_id 

成员(member)

member_id (pk)
person_id
expires

ma​​iling_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 表 person_id 时,成员过期,并且如果 mailing_person 中存在特定 person_id 的 mailing_id,则从 ma​​iling 获取 date_mailed。

Mailing_person 包含多对多,因为 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 的邮件相关的人员,如果是这样,那么他们的任何邮件的 max date_mailed与什么有关?

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

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

以下一些查询可能会解决您的问题,具体取决于您的具体需求。

以下内容将仅返回与 type = 1 的任何邮件相关的人员,并且只会为您提供 type = 1 的邮件的 max date_mailed。mailing_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的人,以及其中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

您还可以想出其他变体...这实际上取决于您想要什么。

关于mysql - 五个表均来自第一个表,如果存在,则将其他表与第五个表中的最大值连接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25231829/

相关文章:

mysql - 谷歌云sql特殊字符

mysql - 如何将子查询请求限制为一个?

mysql - 在 MySQL 中获取最新记录

php - 使用 Doctrine ORM 统计表的所有记录

android - 为什么我的MySql数据库数据没有显示在应用程序中?

html - 如何在 HTML5 Indexed Db 中使用连接?

mysql - 选择在指定日期另一个表中不存在的行

c - 4 功能找到最低/最高位置和值(value)

Java:从数组切片中查找最大值的索引

php - 试图获取非对象的属性 - CodeIgniter