Php 列出主表中的所有mysql记录以及相关子表中的最后一条记录
我想列出mysql主表中的所有记录,只列出相关子表中的最后一条记录。这是代码。但它只输出两个PK表的匹配记录。Not列出主控中的其余记录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
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