Có, bạn có thể làm điều này. Sở trường bạn cần là khái niệm rằng có hai cách để lấy bảng ra khỏi máy chủ bảng. Một cách là ..
FROM TABLE A
Cách khác là
FROM (SELECT col as name1, col2 as name2 FROM ...) B
Lưu ý rằng mệnh đề select và các dấu ngoặc đơn xung quanh nó are một bảng, một bảng ảo.
Vì vậy, bằng cách sử dụng ví dụ mã thứ hai của bạn (tôi đoán ở các cột bạn đang hy vọng lấy ở đây):
SELECT a.attr, b.id, b.trans, b.lang
FROM attribute a
JOIN (
SELECT at.id AS id, at.translation AS trans, at.language AS lang, a.attribute
FROM attributeTranslation at
) b ON (a.id = b.attribute AND b.lang = 1)
Lưu ý rằng bảng thực của bạn attribute
là bảng đầu tiên trong phép nối này và bảng ảo này mà tôi đã gọi là b
là bảng thứ hai.
Kỹ thuật này đặc biệt hữu ích khi bảng ảo là một bảng tóm tắt của một số loại. ví dụ:
SELECT a.attr, b.id, b.trans, b.lang, c.langcount
FROM attribute a
JOIN (
SELECT at.id AS id, at.translation AS trans, at.language AS lang, at.attribute
FROM attributeTranslation at
) b ON (a.id = b.attribute AND b.lang = 1)
JOIN (
SELECT count(*) AS langcount, at.attribute
FROM attributeTranslation at
GROUP BY at.attribute
) c ON (a.id = c.attribute)
Hãy xem nó diễn ra như thế nào? Bạn đã tạo một bảng ảo c
chứa hai cột, nối nó với hai cột kia, được sử dụng một trong các cột cho ON
và trả về mệnh đề kia dưới dạng một cột trong tập kết quả của bạn.