2017-01-08 8 views
-2

2つのテーブル(左結合)。テーブル1とテーブル2を簡単にするために。SQL Left Join Return最新の行

表1には人とその現在のステータスのリストが含まれています。表2はすべての "招待状"です。すべての人が参加の一環として、現在の "人"のリストを表示してから、LATESTの招待状(表2)を表示するので、テーブル2の1行が返されます。

私はすべて動いています。 ..人が複数の招待状を持っていた場合、その複製を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 ";` 

Oboboulsy限界1はそれが想定したことをしません。私は括弧内に追加の文を追加しようとしましたが、正直なところ、すべてを破り、専門家ではありません。

+1

はあなたが唯一table2のから一つのフィールドが必要な場合は –

+0

重複を避けたい場合は、あなたがするように設計されているサブクエリでそれを行うことができDISTINCTおよび/またはGROUP BYを使用します最初に選択して、サブクエリを最新の日付順に並べ替えます。 '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あなたの提案をお寄せいただきありがとうございます。まだそれを動作させるために苦労して - あなたの方法またはあなたが結合を削除すると言っている?それとも? – it05jb

答えて

0

私も専門家ではありませんが、試してみます。あなたはDISTINCTを使ってみましたか? exempleについて

DISTINCT column_name1を選択して、TABLE_NAME FROM column_name2

。 [...]

通常、ダブルマッチが削除されます。 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をサポートするデータベースでは、 "people id"ごとに最新の招待日付を含む一時テーブルを試して、その一時テーブルを招待テーブルに参加させることができます。

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 

が、これはあなたが探していたものです:私たちは、どうやら、それは我々はそれが何をするかを期待して、そのテーブルnewest_invite_date呼び出し、および?

ハッピー演奏... マルコ・セイン