簡體   English   中英

SQL左連接返回最新行

[英]SQL Left Join Return Latest Row

兩個表,左連接。 為方便起見,請參見表 1 和表 2。

表 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 ";`

顯然,限制 1 沒有做它應該做的事情。 我曾嘗試在括號中添加額外的 select 語句,但老實說它只會破壞一切,我根本不是專家。

我也不是專家,但我會嘗試。 您是否嘗試過使用 DISTINCT?

舉個例子:

SELECT DISTINCT column_name1,column_name2

從表名; [...]

它通常刪除雙重匹配。

以下是鏈接: http : //www.w3schools.com/sql/sql_distinct.asp https://www.techonthenet.com/oracle/distinct.php

給出示例數據。 並使用好的表名和列名。 例如:

(這將返回滿足連接的所有行):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM