Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.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
Php 列出主表中的所有mysql记录以及相关子表中的最后一条记录_Php_Sql - Fatal编程技术网

Php 列出主表中的所有mysql记录以及相关子表中的最后一条记录

Php 列出主表中的所有mysql记录以及相关子表中的最后一条记录,php,sql,Php,Sql,我想列出mysql主表中的所有记录,只列出相关子表中的最后一条记录。这是代码。但它只输出两个PK表的匹配记录。Not列出主控中的其余记录 SELECT contact.id, contact.title, contact.init, contact.first_name, contact.last_name, contact.city, contact.home_phone, contact.mobile_phone, contact.e_mail, status.status AS stat

我想列出mysql主表中的所有记录,只列出相关子表中的最后一条记录。这是代码。但它只输出两个PK表的匹配记录。Not列出主控中的其余记录

SELECT contact.id, contact.title, contact.init, contact.first_name, contact.last_name, contact.city, contact.home_phone, contact.mobile_phone, contact.e_mail,  status.status AS status, fundsource.fundsource AS fundsource, category.category AS category,contact.score, ROUND(value/1000000,1) AS value_M, jstate.jstate AS to_do, journal.l_date AS last_activity, journal.note AS journal FROM contact 

    LEFT JOIN journal ON journal.con_id=contact.id 
    LEFT JOIN jstate ON jstate.jstate_code=journal.jstate_code
    LEFT JOIN category ON category.cat_code=contact.cat_code
    LEFT JOIN status ON status.st_code=contact.st_code
    LEFT JOIN fundsource ON fundsource.fundsource_code=contact.fundsource_code 

    WHERE journal.l_date=(SELECT MAX(journal.l_date) from journal WHERE journal.con_id = contact.id) GROUP BY contact.id 

有人能帮我吗?请

您遇到的问题是,您在左联接表中的一个字段上设置了条件,因此WHERE子句基本上否定了左联接

左边的连接表示:给我所有联系信息,如果日记中有匹配的行,也给我

然后,您添加了标准,即,一旦您这样做,只给我journal.l_date为最新日期的行

这基本上排除了任何缺少journal.l_date的内容,从而过滤掉所有没有日记账分录的联系人记录

您需要为不存在的记录引入选项

有两种方法可以做到这一点,具体取决于您使用的数据库

限制联接中的匹配行。 选择contact.id、contact.title、contact.init、contact.first\u name、, contact.last\u name,contact.city,contact.home\u phone,contact.mobile\u phone, contact.e_mail,status.status作为status,fundsource.fundsource作为fundsource, category.category作为category,contact.score,ROUNDvalue/1000000,1作为value\u M, jstate.jstate AS to_do,journ.l_date AS last_activity,journ.note AS journal 从接触 左连接 从日记账中选择* 其中journal.l_date=从journal中选择MAXjournal.l_date 其中journal.con_id=contact.id 旅行 在jstate.jstate_代码=journ.jstate_代码上左键连接jstate 类别上的左连接类别。cat_代码=contact.cat_代码 状态为左连接状态。st_代码=contact.st_代码 在fundsource上左键连接fundsource。fundsource_代码=contact.fundsource_代码 按联系人分组。id

您可以看到,我已将您的条件移动到左侧联接中的一个子选择中,并且我已为该筛选表提供了一个别名journ,这是我用eye完成的,因此您可能需要通过对数据库运行它来验证它

这是我喜欢的方式

但有些数据库可能不喜欢这种语法

另一个选项是使表保持连接短语中的状态,但更改条件以再次启用左连接: `

`

根据数据库支持的内容,使用此选项可能会更幸运


在这里,我允许journal.con_id为NULL,这是一个有效的选项,它更符合左连接背后的基本思想。

但是它会分析错误,因为您的SQL语法中有一个错误;检查与您的MySQL服务器版本对应的手册,以了解第4行的“ON jstate.jstate_code=journal.jstate_code LEFT JOIN category ON category.cat_cod”中要使用的正确语法
SELECT contact.id, contact.title, contact.init, contact.first_name, contact.last_name, contact.city, contact.home_phone, contact.mobile_phone, contact.e_mail,  status.status AS status, fundsource.fundsource AS fundsource, category.category AS category,contact.score, ROUND(value/1000000,1) AS value_M, jstate.jstate AS to_do, journal.l_date AS last_activity, journal.note AS journal FROM contact 

    LEFT JOIN journal ON journal.con_id=contact.id 
    LEFT JOIN jstate ON jstate.jstate_code=journal.jstate_code
    LEFT JOIN category ON category.cat_code=contact.cat_code
    LEFT JOIN status ON status.st_code=contact.st_code
    LEFT JOIN fundsource ON fundsource.fundsource_code=contact.fundsource_code 

    WHERE  (
          (journal.con_id IS NULL) 
         OR  ( journal.l_date=(SELECT MAX(journal.l_date) from journal WHERE journal.con_id = contact.id) 
            )
     GROUP BY contact.id