2017-01-08 89 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 

難道這就是你要找的人?

玩的開心... 馬爾科理智