Mysql SQL:联接两个表,从第一个表中每个条件只得到一个结果
我有以下表格: 拍卖台Mysql SQL:联接两个表,从第一个表中每个条件只得到一个结果,mysql,sql,join,multiple-tables,Mysql,Sql,Join,Multiple Tables,我有以下表格: 拍卖台 Id | Title | Description ------------------------ 1 | Test1 | DescriptionForTest1 2 | Test2 | DescriptionForTest2 3 | Test3 | DescriptionForTest3 及 投标表 AuctionId | UserId | Bidding ---------------------------- 1 | 2 | 10
Id | Title | Description
------------------------
1 | Test1 | DescriptionForTest1
2 | Test2 | DescriptionForTest2
3 | Test3 | DescriptionForTest3
及
投标表
AuctionId | UserId | Bidding
----------------------------
1 | 2 | 10
1 | 32 | 24
1 | 2 | 30
1 | 46 | 50
2 | 13 | 5
2 | 20 | 10
and so on...
现在我想要一个输出,与此类似
AuctionId | Title | Description | UserId
----------------------------------------
1 | Test1 | Desc... | 46
2 | Test2 | Desc... | 20
我需要与最高出价的用户ID每拍卖一行
我知道我可以用两条SQL语句来实现这一点。首先获得所有拍卖,其次是MAX(竞价)。但是我需要在一个语句中使用它,我正在努力获得一个可以工作的SQL语句
谁能帮我一下吗
我使用MySQL作为DBMS
SELECT MAX(BINDING),A.AUCTION_ID,A.DESCRIPTION,A.TITLE,B.USER_ID
FROM AUCTION_TABLE A,BIDS_TABLE B
WHERE A.AUCTION_ID=B.AUCTION_ID
或者尝试使用连接
SELECT MAX(BINDING),A.AUCTION_ID,A.DESCRIPTION,A.TITLE,B.USER_ID
FROM AUCTION_TABLE A
INNER JOIN BIDS_TABLE B ON A.AUCTION_ID=B.AUCTION_ID
或者尝试使用连接
SELECT MAX(BINDING),A.AUCTION_ID,A.DESCRIPTION,A.TITLE,B.USER_ID
FROM AUCTION_TABLE A
INNER JOIN BIDS_TABLE B ON A.AUCTION_ID=B.AUCTION_ID
草莓的答案是单向的。这是第二条路。两个都试试,看看哪一个在你的设置中更快。索引和表大小将产生很大的不同
SELECT High_Bid.AuctionId, A.Title, A.Description, High_Bid.UserID FROM
(
SELECT * FROM
(
SELECT * FROM bids_table
ORDER BY AuctionId, Bidding DESC
) AS B1
GROUP BY AuctionId
) AS High_Bid
JOIN
auction_table AS A
ON High_Bid.AuctionId=A.Id
草莓的答案是单向的。这是第二条路。两个都试试,看看哪一个在你的设置中更快。索引和表大小将产生很大的不同
SELECT High_Bid.AuctionId, A.Title, A.Description, High_Bid.UserID FROM
(
SELECT * FROM
(
SELECT * FROM bids_table
ORDER BY AuctionId, Bidding DESC
) AS B1
GROUP BY AuctionId
) AS High_Bid
JOIN
auction_table AS A
ON High_Bid.AuctionId=A.Id
查询:
SELECT t.*
FROM (
SELECT a.Id AS AuctionId,
a.Title,
a.Description,
(SELECT b.UserId
FROM Bids b
WHERE b.AuctionId = a.Id
ORDER BY b.Bidding DESC
LIMIT 1) as UserId
FROM Auction a) t
WHERE T.UserID is not null
结果:
| AUCTIONID | TITLE | DESCRIPTION | USERID |
----------------------------------------------------
| 1 | Test1 | DescriptionForTest1 | 46 |
| 2 | Test2 | DescriptionForTest2 | 20 |
查询:
SELECT t.*
FROM (
SELECT a.Id AS AuctionId,
a.Title,
a.Description,
(SELECT b.UserId
FROM Bids b
WHERE b.AuctionId = a.Id
ORDER BY b.Bidding DESC
LIMIT 1) as UserId
FROM Auction a) t
WHERE T.UserID is not null
结果:
| AUCTIONID | TITLE | DESCRIPTION | USERID |
----------------------------------------------------
| 1 | Test1 | DescriptionForTest1 | 46 |
| 2 | Test2 | DescriptionForTest2 | 20 |
它使用以下sql:
select ID, Title, Description, UserId from Auction a
right join Bids b on a.ID = b.AuctionId
right join (select AuctionId, max(Bidding) as Bidding from Bids group by AuctionId) c on b.AuctionId = c.AuctionId and b.Bidding = c.Bidding;
小提琴在这里:
与第三个用户的结果:
ID TITLE DESCRIPTION USERID
1 Test1 DescriptionForTest1 46
2 Test2 DescriptionForTest2 20
3 Test3 DescriptionForTest3 23
它使用以下sql:
select ID, Title, Description, UserId from Auction a
right join Bids b on a.ID = b.AuctionId
right join (select AuctionId, max(Bidding) as Bidding from Bids group by AuctionId) c on b.AuctionId = c.AuctionId and b.Bidding = c.Bidding;
小提琴在这里:
与第三个用户的结果:
ID TITLE DESCRIPTION USERID
1 Test1 DescriptionForTest1 46
2 Test2 DescriptionForTest2 20
3 Test3 DescriptionForTest3 23
请注意,此方法没有文档记录(除非您计算手册相关页面的
注释部分),并且实际上依赖于MySQL设计的特性。也就是说,其他流行的“黑客”也可以这么说,这并不是完全无视解决方案的理由。但它的执行速度不可能比上面的“文档化”解决方案快得多。请注意,此方法没有文档化(除非您计算手册相关页面的注释部分),并且实际上依赖于MySQL设计的特性。也就是说,其他流行的“黑客”也可以这么说,这并不是完全无视解决方案的理由。但它的执行速度不太可能比上面的“文档化”解决方案快得多。