簡體   English   中英

返回在一列中具有相似值的行

[英]Return rows that have similar values in one column

我需要一些幫助來返回在其中一列中具有通用值的行。 數據格式如下:

表(人)-所有參與者的姓名

* ID * Name      *
------------------
* 1  * Alice     *
* 2  * Bruce     *
* 3  * Charlie   *
* 4  * Dan       *
* 5  * Eric      *
* 6  * Fannie    *

表格(列表)-每個事件的與會者列表

* Txn * Event_ID * ID *
-----------------------
* T1  * A        * 1 *
* T2  * A        * 2 *
* T3  * A        * 3 *
* T4  * A        * 4 *
* T5  * B        * 1 *
* T6  * B        * 2 *
* T7  * B        * 5 *
* T8  * B        * 6 *

我想找出(i)之前是否有兩個人見過面,如果是,則(ii)在哪個場合見過面。 在這種情況下,我很想了解參與者1和參與者2是否曾見過,期望的結果:

* Event_ID *  ID *  Name  * Txn *
---------------------------------
* A        *  1  *  Alice * T1  *
* A        *  2  *  Bruce * T2  *
* B        *  1  *  Alice * T5  *
* B        *  2  *  Bruce * T6  *

到目前為止,這是我想出的代碼:

SELECT EVENT_ID, Txn
FROM People
JOIN List ON People.ID=List.ID
WHERE (List.ID=1 OR List.ID=2)
Group BY TXN, EVENT_ID

當前,它僅返回參與者1和參與者2參加的所有事件。我認為我需要按組和計數進行進一步的排序,但是不確定如何將其合並到代碼中。

GROUP BY EVENT_ID, HAVING COUNT (EVENT_ID)>1

您根本不需要分組,只需要將表自身連接即可。

SELECT
*
FROM list l1
JOIN list l2 ON l1.ID != l2.ID AND l1.Event_ID = l2.Event_ID
WHERE
1 IN (l1.ID, l2.ID)
AND 2 IN (l1.ID, l2.ID)

如果只想讓兩個人知道這一點,則可以選擇返回一行,其中包含兩個人。 當然,如果您想擴展到更多人,這將無法很好地擴展:

select
  a1.Event_ID,
  a1.Txn as Txn1,
  a2.Txn as Txn2,
  p1.ID as ID1,
  p1.Name as Name1,
  p2.ID as ID2,
  p2.Name as Name2
from
  List a1
  inner join List a2 
    on a2.Event_ID = a1.Event_ID
    and a2.Id <> a1.Id
  inner join People p1 on p1.ID = a1.ID
  inner join People p2 on p2.ID = a2.ID
where
  p1.ID = 1 and p2.ID = 2

好的,我只是想,也許您正在尋找人們會面的事件,即不是在只有一個人的情況下尋找事件(這是我以前的代碼中的缺陷,請參見下文)。 這僅用於查找兩個人參加的事件:

select l.event_id, p.id as person_id, p.name as person_name, l.txn as txn_id
from people p
inner join list l
on p.id=l.person_id
inner join 
(
 select event_id, count(*) as headcount
 from list
 group by event_id
) x
on l.event_id=x.event_id
where x.headcount > 1
group by l.event_id, p.id, p.name

舊答案

我認為您需要這樣做:

select l.event_id, p.id as person_id, p.name as person_name, l.txn as txn_id 
from people p
inner join list l
on p.id=l.person_id
group by l.event_id, p.id, p.name

結果:

# event_id, person_id, person_name, txn_id
'A', '1', 'Alice', 'T1'
'A', '2', 'Bruce', 'T2'
'A', '3', 'Charlie', 'T3'
'A', '4', 'Dan', 'T4'
'B', '1', 'Alice', 'T5'
'B', '2', 'Bruce', 'T6'
'B', '5', 'Eric', 'T7'
'B', '6', 'Fannie', 'T8'

我在列表中使用了列名作為“ person_id”,以避免與人員表中的“ id”列混淆。 另外,我想id是列表表中的主鍵和自動ID,這里的'person_id'是引用人員表中ID的外鍵。

根據各種響應,以下代碼與我所尋找的最接近。

唯一的小問題是我無法按我原來想要的順序獲取輸出列。 小不便。

SELECT l1.Event_ID, l1.ID, p.Name, l1.Txn
FROM list l1
JOIN list l2 ON l1.ID != l2.ID AND l1.Event_ID = l2.Event_ID
JOIN people p ON l1.ID = p.ID
WHERE
1 IN (l1.ID, l2.ID)
AND 2 IN (l1.ID, l2.ID)
ORDER BY l1.Event_ID, l1.ID;

查看在dbfiddle上工作的代碼

暫無
暫無

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

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