如何使用 mysql 连接 return 从最右边的 table 仅一行
How to return only one row from the right-most table using mysql join
我有两个 table。我想以一种方式加入它们,即只为最左侧 table 中的记录返回右侧 table 中的一条记录(第一个匹配的记录)。这两个 table 是一对多的关系。以下是 table:
事件table:
-------------------------------------------------------------
| 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 |
--------------------------------------------------------------
门票table:
-----------------------------------------------
|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 吗?我愿意接受任何其他想法
你不能仅使用 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
);
这可以使用 TOP 1
SELECT TOP 1 *
FROM Events e
INNER JOIN Tickets t
ON e.event_id = t.event_id
ORDER BY t.ticket_id
或者,更慢,只使用 join
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
这些总是很有趣,问题通常被称为group-wise maximum which you can also read more about on dev.mysql.com。
一种方法是像这样使用派生的 table:
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)
请注意,这将 return 每个 event_id
的单个结果,无论是否 任何 对应的行在票证 table 中找到.相比之下,Gordon Linoff 的回答只会 return 至少有一张相应门票的事件。
我有两个 table。我想以一种方式加入它们,即只为最左侧 table 中的记录返回右侧 table 中的一条记录(第一个匹配的记录)。这两个 table 是一对多的关系。以下是 table:
事件table:
-------------------------------------------------------------
| 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 |
--------------------------------------------------------------
门票table:
-----------------------------------------------
|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 吗?我愿意接受任何其他想法
你不能仅使用 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
);
这可以使用 TOP 1
SELECT TOP 1 *
FROM Events e
INNER JOIN Tickets t
ON e.event_id = t.event_id
ORDER BY t.ticket_id
或者,更慢,只使用 join
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
这些总是很有趣,问题通常被称为group-wise maximum which you can also read more about on dev.mysql.com。
一种方法是像这样使用派生的 table:
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)
请注意,这将 return 每个 event_id
的单个结果,无论是否 任何 对应的行在票证 table 中找到.相比之下,Gordon Linoff 的回答只会 return 至少有一张相应门票的事件。