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

时间:2019-01-22 07:54:59

标签: mysql sql

我需要一些帮助来返回在其中一列中具有共同值的行。数据格式如下:

表(人)-所有参与者的名字

* 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

4 个答案:

答案 0 :(得分: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)
  • sqlfiddle中查看它在这里的运作方式

答案 1 :(得分:0)

如果只想让两个人知道,则可以选择返回一行,其中包含两个人。当然,如果您想扩展到更多的人,这将无法很好地扩展:

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

答案 2 :(得分:0)

好吧,我只是想,也许您正在寻找人们见面的事件,即不是在只有一个人的事件(这是我以前的代码的缺陷,请参见下文)。这样可以查找仅两个人参加的活动:

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的外键。

答案 3 :(得分:-1)

基于各种响应,以下代码与我所寻找的最接近。

唯一的问题是,我无法按我原来想要的顺序获取输出列。轻微的不便。

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的代码