MySQL查找同一个表中是否存在具有相同值的其他行

时间:2013-06-10 19:34:28

标签: mysql join subquery

我对MySQL比较陌生,需要一些指导。我有一个名为event的表,看起来像这样

---------------------------------------------------------------
| event_id | promoter_id | venue_id | event_date | attendance |
---------------------------------------------------------------
|    0     |      5      |     1    | 2013-05-30 |     400    |
|    1     |      2      |     6    | 2013-06-09 |     104    |
|    2     |      9      |     1    | 2013-05-30 |     300    |
|    3     |      1      |     3    | 2013-06-09 |     205    |
|    4     |      3      |     2    | 2013-06-01 |     175    |
|    5     |      5      |     2    | 2013-06-01 |     295    |
---------------------------------------------------------------

我正在寻找与其他活动在同一地点和日期发生的发起人活动的出席情况。在这个例子中,我想从查询中回来的是参加同一地点和日期的发起人5的所有活动的出席。

--------------
| attendance |
--------------
|     400    |
|     295    |
--------------

这个查询对我来说具有逻辑意义,但显然我遗漏了一些东西,因为它会产生语法错误......

SELECT t1.attendance FROM events t1 WHERE promoter_id=5 
    JOIN (SELECT event_id, venue_id, event_date, attendance FROM events 
        WHERE promoter_id!=5) t2 
    ON t1.event_id=t2.event_id 
    WHERE t1.venue_id=t2.venue_id 
        AND t1.event_date=t2.event_date;

非常感谢任何帮助,我没有在我自己的研究中接近我需要的任何地方。我更喜欢在没有创建视图的情况下这样做,因为在得到结果后我必须删除视图(随着表的增长,我觉得这可能会影响性能,特别是当我打算为每个启动器运行此查询时)。

由于

4 个答案:

答案 0 :(得分:0)

SELECT t1.attendance 
FROM   events t1 
WHERE  promoter_id = 5 
       AND EXISTS (SELECT event_id
                   FROM events 
                   WHERE promoter_id!=5
                         AND venue_id = t1.venue_id=venue_id 
                         AND event_date = t1.event_date)

答案 1 :(得分:0)

如果我理解正确,你会包括400和295,因为其他发起人在同一天在同一场地举办了活动。如果是这种情况,请试试这个:

SELECT attendance
FROM events
WHERE promoter_id = 5 AND (venue_id, event_date) IN (
  SELECT venue_id, event_date
  FROM events
  WHERE promoter_id <> 5)

答案 2 :(得分:0)

SELECT attendance FROM events NATURAL JOIN (
  SELECT   venue_id, event_date
  FROM     events
  GROUP BY venue_id, event_date
  HAVING   COUNT(*) > 1
) t WHERE promoter_id = 5

sqlfiddle上查看。

答案 3 :(得分:0)

我看到有很多答案,但要解决语法错误: 您在JOIN之前执行WHERE子句。 where子句也是不明确的,因为它指向表t1和t2中的promoter_id。

试试这个:

/* Select sum of attendance columns */
SELECT (t1.attendance + t2.attendance) attendance
FROM events t1
/*Specify Join immediately after FROM clause*/
JOIN events t2
/* declare all join specific conditionals before initiating WHERE clause */
ON t1.venue_id = t2.venue_id
AND t1.event_date = t2.event_date
AND t2.promoter_id != 5
WHERE t1.promoter_id = 5;

以上查询将为您提供:

--------------
| attendance |
--------------
|     700    |
|     470    |
--------------

为了解决这个问题,你可以将出勤率的总和分开。

SELECT t1.attendance, t2.attendance, t1.venue_id
FROM events t1
/*Specify Join immediately after FROM clause*/
JOIN events t2
/* declare all join specific conditionals before initiating WHERE clause */
ON t1.venue_id = t2.venue_id
AND t1.event_date = t2.event_date
AND t2.promoter_id != 5
WHERE t1.promoter_id = 5;

以上查询将为您提供:

---------------------------------------
| attendance |  attendance | venue_id |
---------------------------------------
|     400    |       300   | 1        |
|     295    |       175   | 2        |
---------------------------------------