SQL Left Join返回最新行

时间:2017-01-08 18:22:36

标签: php sql left-join

两个表,左连接。为方便表1和表2。

表1包含人员及其当前状态的列表,表2是他们所有的"邀请"。所有即时尝试作为加入的一部分,都会在列表中显示所有当前"人员"然后是LATEST邀请状态(来自表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 ";`

显然,限制1并没有做到它应该做的事情。我试过在括号中添加额外的select语句,但说实话它只是打破了所有内容,而且我根本不是专家。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

但我们只希望'Arthur'与'2017-01-08'和'Tricia'与'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

这是你在找什么?

快乐的比赛...... Marco the Sane