2

我有两张桌子。我想以这样一种方式加入它们,即只为最左边的表中的记录返回右表中的一条记录(第一个匹配的记录)。这两个表具有一对多的关系。以下是下表:

事件表:

      -------------------------------------------------------------
      | event_id | event_name |event_details|event_venue|dress_code|
      -------------------------------------------------------------
      | 1        | club 92    |blah blahblah|somewhere  |something |
      | 2        | graduation |blah blahblah|somewhere  |something |
      | 3        | party      |blah blahblah|somewhere  |something |
      --------------------------------------------------------------

门票表:

      -----------------------------------------------
      |ticket_id | ticket_name  | price | event_id  |
      -----------------------------------------------
      | 1        | first        |   0   |   1       |
      | 2        | second       |   10  |   1       |
      | 3        | third        |   100 |   1       |
      | 4        | fourth       |   10  |   2       |
      | 5        | fifth        |   200 |   2       |
      -----------------------------------------------

这可以使用 join 吗?我对任何其他想法持开放态度

4

4 回答 4

3

您不能仅使用join. 这是一种方法:

select e.*, t.*
from events e join
     tickets t
     on e.event_id = t.event_id
where t.id = (select min(t2.id)
              from tickets t2
              where t2.event_id = t.event_id
             );
于 2016-08-07T03:27:41.290 回答
2

这些总是很有趣,这个问题通常被称为分组最大值,您也可以在dev.mysql.com上阅读更多信息。

一种方法是使用这样的派生表:

SELECT *
FROM events e
LEFT JOIN
(
    SELECT event_id, MIN(ticket_id) AS ticket_id
    FROM tickets
    GROUP BY event_id
) t2 USING (event_id)
LEFT JOIN tickets t USING (ticket_id)

event_id请注意,无论在门票表中是否找到任何相应的行,这将为每个返回一个结果。相比之下,Gordon Linoff 的答案只会返回至少有一张对应票的事件。

于 2016-08-07T08:23:05.110 回答
0

或者,速度较慢,仅使用连接

SELECT e.*,t.*
  FROM events e
  JOIN tickets t
    ON t.event_id = e.event_id
  LEFT 
  JOIN tickets x
    ON x.event_id = t.event_id
   AND x.ticket_id > t.ticket_id
 WHERE x.ticket_id IS NULL
于 2016-08-07T07:26:53.803 回答
-1

这可以使用 TOP 1

SELECT TOP 1 *
FROM Events e
INNER JOIN Tickets t
ON e.event_id = t.event_id
ORDER BY t.ticket_id
于 2016-08-07T03:31:43.510 回答