Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL查询(或Doctrine 1.2查询)-从联接表中获取最新的项并进行筛选_Mysql_Join_Max_Doctrine 1.2 - Fatal编程技术网

MySQL查询(或Doctrine 1.2查询)-从联接表中获取最新的项并进行筛选

MySQL查询(或Doctrine 1.2查询)-从联接表中获取最新的项并进行筛选,mysql,join,max,doctrine-1.2,Mysql,Join,Max,Doctrine 1.2,我在构造查询以执行以下操作时遇到问题: 按活动\类型\ id筛选联系人,仅显示最近活动具有所需活动\类型\ id或为空(无活动)的联系人 表格的结构如下: 联系人可以有多种不同类型的活动 activity: id contact_id activity_type_id date contact: id first_name last_name 到目前为止,我有: SELECT * FROM ( SELECT c.first_name, c.last_name, a.activity_

我在构造查询以执行以下操作时遇到问题:

按活动\类型\ id筛选联系人,仅显示最近活动具有所需活动\类型\ id或为空(无活动)的联系人

表格的结构如下:

联系人可以有多种不同类型的活动

activity:
id
contact_id
activity_type_id
date

contact:
id
first_name
last_name
到目前为止,我有:

SELECT * FROM (
    SELECT c.first_name, c.last_name, a.activity_type_id, MAX(a.date) AS maxdate 
    FROM contact AS c
    LEFT JOIN activity AS a ON a.contact_id = c.id
    GROUP BY c.id
    ORDER BY c.first_name  ASC
) AS act
然后将其添加到过滤器:

WHERE activity_type_id = 3 /* <- I would like to filter using this */
最终原因可以调整为返回各种活动类型或设置为空

DQL 1.2兼容版本

SELECT c.first_name, c.last_name, a.activity_type_id FROM contact c
  LEFT JOIN
    (SELECT a1.contact_id, a1.date, a1.activity_type_id FROM activity a1
      JOIN (SELECT contact_id, MAX(DATE) DATE FROM activity GROUP BY contact_id) a2
        ON a1.contact_id = a2.contact_id AND a1.date = a2.date
     ) a
  ON c.id = a.contact_id  
WHERE a.activity_type_id = 2;
SELECT * FROM contact c
LEFT JOIN activity ON c.id = contact_id
WHERE ROW (c.id,DATE) IN (SELECT contact_id, MAX(date) date FROM activity  GROUP BY contact_id)
AND activity_type_id = 2
请尝试此查询-

编辑:a1.添加活动类型id

SELECT c.first_name, c.last_name FROM contacts c
  LEFT JOIN
    (SELECT a1.contact_id, a1.date, a1.activity_type_id FROM activity a1
      JOIN (SELECT contact_id, MAX(date) date FROM activity GROUP BY contact_id) a2
        ON a1.contact_id = a2.contact_id AND a1.date = a2.date
     ) a
  ON c.contact_id = a.contact_id
WHERE a.contact_id IS NULL OR a.activity_type_id = 3;

精彩的。非常感谢。我需要花些时间弄清楚这件事。。转换为DQL应该很有趣。我不得不做一些小的修改。我已经在问题中提出了最后一个问题。好的,我会解释一下。子查询返回正确行的子集-按
contact\u id
列出的最新行。是否可以在没有子查询的情况下执行此操作?否,您不能避免使用子查询,因为您应该从
activity
表中选择确切的记录,然后按
activity\u type\u id
字段进行筛选。我在回答中也添加了此字段;-)谢谢,我能够重写它,使其与DQL兼容,并编辑了这个问题。