2012-12-18 7 views
5

Tôi gặp sự cố trong mệnh đề where của truy vấn con INNER JOIN của tôi. Tôi nhận được lỗi cột không xác định cho M.idMembre. Tôi đã thử sử dụng tên bảng thay vì bí danh nhưng tôi nhận được cùng một vấn đề. Tôi cũng đã cố gắng loại bỏ mệnh đề WHERE khỏi truy vấn con và thêm điều kiện này vào mệnh đề ON sau truy vấn con. Tuy nhiên, tôi cũng gặp vấn đề tương tự. Tôi cảm thấy nó là một cái gì đó hiển nhiên tôi đang thiếu ở đây.Cột không xác định trong truy vấn con nơi khoản

SELECT DISTINCT M.`idMembre` , `couponsTypes`.`maxCouponType` 
FROM membres AS `M` 
INNER JOIN (
SELECT idMembre, MAX(coupons.`idType`) AS `maxCouponType` 
FROM coupons 
WHERE coupons.`idMembre` = M.`idMembre` 
GROUP BY idMembre 
) AS `couponsTypes` 
ON M.`idMembre` = couponsTypes.`idMembre` 
ORDER BY maxCouponType DESC 

Hãy cho tôi biết nếu bạn cần thêm thông tin.

+0

Bạn dường như không sử dụng bất kỳ tiêu chí tham gia, tham gia bên trong ... ON ... –

+0

Tôi cũng đã thử với định dạng INNER JOIN thông thường nhưng tôi nhận được lỗi tương tự cho cột này. 'SELECT DISTINCT M.idMembre, couponsTypes.maxCouponType TỪ membres AS M INNER JOIN (SELECT MAX (coupons.idType) AS maxCouponType TỪ phiếu giảm giá) AS couponsTypes ON M.idMembre = coupons.idMembre ORDER BY maxCouponType DESC' – oliboon

+0

Sử dụng bí danh cho bảng phiếu thưởng cũng mang lại cho tôi vấn đề về cột không xác định. – oliboon

Trả lời

7

Bạn không được phép tham chiếu các bảng bên ngoài trong truy vấn con trong mệnh đề nối. Một cách để giải quyết điều này bằng cách thực hiện một group by trong subquery dựa trên điều kiện tham gia:

SELECT DISTINCT M.`idMembre`, `couponsTypes`.`maxCouponType` 
FROM membres AS `M` INNER JOIN 
    (SELECT idMembre, MAX(coupons.`idType`) AS `maxCouponType` 
     FROM coupons 
     group by idmembre 
    ) `couponsTypes 
    on couponstypes.idMembre = M.idMember 
ORDER BY maxCouponType DESC 

Tuy nhiên, bạn không cần bảng membres ở tất cả. Mặc dù được tham chiếu ở bên ngoài select, nó tương đương với id thành viên trong bảng loại phiếu thưởng. Vì vậy, bạn có thể viết truy vấn của mình dưới dạng:

 SELECT idMembre, MAX(coupons.`idType`) AS `maxCouponType` 
     FROM coupons 
     group by idmembre 
     order by 2 desc 

Đây có thể là cách xây dựng đơn giản và hiệu quả nhất.

+0

Có sự khác biệt nào giữa các truy vấn trong trường hợp các thành viên không phải là duy nhất trong bảng 'membre' không? Có thể không hoàn toàn có được đầu của tôi xung quanh đó, nhưng tôi chỉ mới nhận được từ một bữa ăn trưa khá boozy ... – eggyal

+0

@eggyal. . . Trong trường hợp này, có thực sự không phải là một sự khác biệt. 'Distinct' loại bỏ các bản sao. Tôi sẽ không viết truy vấn theo cách đó, nhưng không có sự khác biệt. –

+0

Điểm tốt về 'màng 'cũng không cần thiết. – eggyal

1

Truy vấn phụ của bạn không có quyền truy cập vào các bảng trong truy vấn bên ngoài. Tức là, bảng membres (được đặt tên là M) không khả dụng tại thời điểm truy vấn con couponsTypes được đánh giá.

Tuy nhiên, truy vấn phụ này không cần thiết trong trường hợp này; bạn chỉ cần tham gia trực tiếp vào các bảng và nhóm kết quả:

SELECT idMembre, MAX(coupons.idType) AS maxCouponType 
FROM  membres JOIN coupons USING (idMembre) 
GROUP BY idMembre 
ORDER BY maxCouponType DESC