Tôi giả sử rằng bạn muốn nói rằng bạn muốn id
món đồ đắt nhất dựa trên dữ liệu từ cả ba bảng. Đối với mỗi bảng, bạn cần id
và giá của (các) mặt hàng với giá tối đa trong bảng đó. Đối với một bảng, đó là:
SELECT id, price FROM Tn WHERE price = (SELECT MAX(price) FROM Tn)
Vì vậy, có một truy vấn phụ:
SELECT id, price FROM T1 WHERE price = (SELECT MAX(price) FROM T1)
UNION
SELECT id, price FROM T2 WHERE price = (SELECT MAX(price) FROM T2)
UNION
SELECT id, price FROM T3 WHERE price = (SELECT MAX(price) FROM T3)
Và, bạn cần tìm một trong các id
giá trị với giá tối đa từ truy vấn phụ đó:
SELECT id
FROM (SELECT id, price FROM T1 WHERE price = (SELECT MAX(price) FROM T1)
UNION
SELECT id, price FROM T2 WHERE price = (SELECT MAX(price) FROM T2)
UNION
SELECT id, price FROM T3 WHERE price = (SELECT MAX(price) FROM T3)
) AS M
ORDER BY price DESC
LIMIT 1
Lưu ý rằng nếu có hai mục đắt tiền như nhau được liệt kê trong bất kỳ một trong các bảng, truy vấn UNION sẽ trả về hơn 3 hàng. Nếu có hai hoặc nhiều mặt hàng đắt tiền như nhau, truy vấn với GIỚI HẠN sẽ chọn một mặt hàng và bạn không thể dự đoán được mặt hàng nào. Nếu bạn cần xem tất cả các id
giá trị của các mặt hàng đắt tiền tương đương có giá cao nhất, thì bạn cần chơi một trò chơi tương tự bằng các truy vấn lồng nhau. Điều này thổi vào tâm trí của tôi, nhưng nên hoạt động:
SELECT id, price
FROM (SELECT id, price FROM T1 WHERE price = (SELECT MAX(price) FROM T1)
UNION
SELECT id, price FROM T2 WHERE price = (SELECT MAX(price) FROM T2)
UNION
SELECT id, price FROM T3 WHERE price = (SELECT MAX(price) FROM T3)
) AS M
WHERE price =
(SELECT MAX(Price)
FROM (SELECT id, price FROM T1 WHERE price = (SELECT MAX(price) FROM T1)
UNION
SELECT id, price FROM T2 WHERE price = (SELECT MAX(price) FROM T2)
UNION
SELECT id, price FROM T3 WHERE price = (SELECT MAX(price) FROM T3)
) AS M2
);
Điều này sẽ dễ dàng hơn khi sử dụng mệnh đề VỚI:
WITH MaxPrices AS
(SELECT id, price FROM T1 WHERE price = (SELECT MAX(price) FROM T1)
UNION
SELECT id, price FROM T2 WHERE price = (SELECT MAX(price) FROM T2)
UNION
SELECT id, price FROM T3 WHERE price = (SELECT MAX(price) FROM T3)
)
SELECT id, price
FROM M
WHERE price = (SELECT MAX(Price) FROM M);
Không phải mọi DBMS đều hỗ trợ mệnh đề VỚI như thế này và tôi tin rằng MySQL là một trong những DBMS trong danh mục không bao gồm hỗ trợ đó.