【问题标题】:How to return only one row from the right-most table using mysql join如何使用mysql join从最右边的表中只返回一行
【发布时间】:2016-12-13 03:06:11
【问题描述】:

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

事件表:

      -------------------------------------------------------------
      | 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 吗?我对任何其他想法持开放态度

【问题讨论】:

  • 您能否更具体地了解门票表中的哪条记录?

标签: mysql sql groupwise-maximum


【解决方案1】:

您不能只使用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
             );

【讨论】:

    【解决方案2】:

    这些总是很有趣,问题通常被称为group-wise maximum,您也可以在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 的答案只会返回至少有一张对应票的事件。

    【讨论】:

      【解决方案3】:

      或者,更慢,只使用连接

      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
      

      【讨论】:

        【解决方案4】:

        这可以使用 TOP 1

        SELECT TOP 1 *
        FROM Events e
        INNER JOIN Tickets t
        ON e.event_id = t.event_id
        ORDER BY t.ticket_id
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-02
          • 2022-10-13
          • 1970-01-01
          相关资源
          最近更新 更多