2017-01-08 90 views
-2

两张表,左连接。用于缓解表1和表2.SQL左连接返回最近行

表1包含人员及其当前状态的列表,表2是其所有“邀请”。所有即时通讯尝试作为连接的一部分在列表中显示所有当前的“人员”,然后显示最新的邀请状态(从表2),因此返回表2中的单个行。

我有一切正常工作。 ..但它的复制,例如,如果一个人有多个邀请它会把他们两次的名单。我只是想限制它到

$sql = "SELECT table1.fieldname as table1fielname table2.fieldname [more fields] 
     FROM xxx 
     LEFT JOIN xxx on table1.sharedid=table2.sharedid 
     WHERE XXX LIMIT 1 ";` 

Obvioulsy极限1不做它应该的。我试图在括号中添加额外的选择语句,但说实话它只是打破了一切,我根本不是专家。

+1

使用DISTINCT和/或GROUP BY,如果你想避免重复 –

+0

如果您只需要从表2一个领域,你可以用被设计为一个子查询做到这一点先选择,然后按最新日期排序子查询。 'SELECT table1.fieldname,(SELECT FIRST table2.invitestatus FROM table2 WHERE table1.shareid = table2.shareid ORDER BY table2.date desc)AS InviteStatus FROM ... WHERE ...' –

+0

@LudvigRydahl感谢您的建议,尽管im仍然努力让它工作 - 你的方式或你说删除加入?还是保留它? – it05jb

回答

0

我不是专家,但我会尝试。你有没有试过使用DISTINCT?

对于为例:

SELECT DISTINCT column_name1,column_name2

FROM TABLE_NAME; [...]

它通常会删除双重匹配。

这里是链接: http://www.w3schools.com/sql/sql_distinct.asp https://www.techonthenet.com/oracle/distinct.php

+0

如果可以张贴屏幕截图可能有助于回答问题 – JamshaidRiaz

+0

你好,不幸的是DISTINCT不工作。至于截图 - 我已经把我的代码放在上面了?我错过的唯一的东西就是数据的回声。 而($行= $ result-> FETCH_ASSOC()){ \t回声 “ ​​”。$行[ “名称”]。 “ \t \t​​”。$行[ “statusname”]“。 \t \t​​“。$ row [”trialstatus“]” – it05jb

0

给出的示例数据。并使用良好的表格和栏目名称。例如:

(它返回满足连接所有行):

WITH people(ppl_id,ppl_name,status) AS (
      SELECT 1,'Arthur','active' 
UNION ALL SELECT 2,'Tricia','active' 
), invites(ppl_id,inv_id,inv_date) AS (
      SELECT 1,1, DATE '2017-01-01' 
UNION ALL SELECT 1,2, DATE '2017-01-07' 
UNION ALL SELECT 1,3, DATE '2017-01-08' 
UNION ALL SELECT 2,1, DATE '2017-01-01' 
UNION ALL SELECT 2,2, DATE '2017-01-08' 
) 
SELECT 
    * 
FROM people 
JOIN invites USING(ppl_id) 
ORDER BY 1 
; 
ppl_id|ppl_name|status|inv_id|inv_date 
    1|Arthur |active|  1|2017-01-01 
    1|Arthur |active|  3|2017-01-08 
    1|Arthur |active|  2|2017-01-07 
    2|Tricia |active|  2|2017-01-08 
    2|Tricia |active|  1|2017-01-01 

但我们只希望“亚瑟”与“2017年1月8日”和“特里西娅”与“2017-01- 08' 。

对于任何支持ANSI 99的数据库,您可以尝试使用包含每个“人员ID”的最新邀请日期的临时表,并将该临时表与邀请表一起加入。我们称之为表newest_invite_date,而且,很显然,它做什么,我们希望它做的事:

WITH people(ppl_id,ppl_name,status) AS (
      SELECT 1,'Arthur','active' 
UNION ALL SELECT 2,'Tricia','active' 
), invites(ppl_id,inv_id,inv_date) AS (
      SELECT 1,1, DATE '2017-01-01' 
UNION ALL SELECT 1,2, DATE '2017-01-07' 
UNION ALL SELECT 1,3, DATE '2017-01-08' 
UNION ALL SELECT 2,1, DATE '2017-01-01' 
UNION ALL SELECT 2,2, DATE '2017-01-08' 
), newest_invite_date(ppl_id,inv_date) AS (
      SELECT ppl_id,MAX(inv_date) 
      FROM invites 
      GROUP BY ppl_id    
) 
SELECT 
    people.ppl_id 
, people.ppl_name 
, people.status 
, newest_invite_date.inv_date 
FROM people 
JOIN newest_invite_date USING(ppl_id) 
ORDER BY 1 
; 
ppl_id|ppl_name|status|inv_date 
    1|Arthur |active|2017-01-08 
    2|Tricia |active|2017-01-08 

难道这就是你要找的人?

玩的开心... 马尔科理智